您的位置:首页 > 其它

CListCtrl控件(4)重绘CListCtrl控件的标题栏

2010-04-28 16:47 113 查看
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 <nItems; 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()); 运行程序,你会发现列表控件的标题栏被重绘了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: