CListCtrl控件的标题栏默认是灰色的,如果和旁边的颜色不搭配,想要修改它的颜色,如何做呢?下面给出了实现方法。
1.从CHeaderCtrl继承,新建一个类,在这里我把新建的这个类命名为CColorHeaderCtrl。从名字来看,CHeaderCtrl类应该是用来控制标题的,除了能控制列表的标题以外,还能不能控制其他东西的标题我就没深入研究过了。
2.对CColorHeaderCtrl类的WM_PAINT消息进行消息响应,在响应函数里进行标题的重绘,响应函数的实现如下:
void CColorHeaderCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CHeaderCtrl::OnPaint() for painting messages
CRect rect;
GetClientRect(rect);
dc.FillSolidRect(rect,RGB(147,212,255)); //重绘标题栏颜色
int nItems = GetItemCount();
CRect rectItem;
CPen m_pen(PS_SOLID,1,RGB(211,211,211)); //分隔线颜色
CPen * pOldPen=dc.SelectObject(&m_pen);
CFont m_font;
m_font.CreatePointFont(90,"宋体"); //字体
CFont * pOldFont=dc.SelectObject(&m_font);
dc.SetTextColor(RGB(13,141,237)); //字体颜色
for(int i = 0; i {
GetItemRect(i, &rectItem);
rectItem.top+=2;
rectItem.bottom+=2;
dc.MoveTo(rectItem.right,rect.top); //重绘分隔栏
dc.LineTo(rectItem.right,rectItem.bottom);
TCHAR buf[256];
HD_ITEM hditem;
hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER;
hditem.pszText = buf;
hditem.cchTextMax = 255;
GetItem( i, &hditem ); //获取当然列的文字
UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_TOP |DT_CENTER | DT_END_ELLIPSIS ;
dc.DrawText(buf, &rectItem, uFormat); //重绘标题栏的文字
}
dc.SelectObject(pOldPen);
dc.SelectObject(pOldFont);
}
3.能重绘标题的CColorHeaderCtrl类已经设计好了,接下来如何应用到列表控件上呢?首先要从CListCtrl继承,新建一个列表控件类,这里我为新建的列表控件类命名为CMyListCtrl,接下来为CMyListCtrl类添加成员变量:
CColorHeaderCtrl m_colorheader;
没错,就是上面设计的类型为CColorHeaderCtrl的成员变量。接下来,为你想要重绘标题栏的列表控件关联一个成员变量,变量类型为CMyListCtrl,这里我取变量名为m_colorlistctrl。最后在合适的地方,譬如说包含列表控件的父窗口的OnInitDialog()函数里添加以下代码:
CHeaderCtrl * m_head=m_colorlistctrl.GetHeaderCtrl();
m_colorlistctrl.m_colorheader.SubclassWindow(m_head->GetSafeHwnd());
运行程序,你会发现列表控件的标题栏被重绘了。
阅读(1556) | 评论(0) | 转发(0) |