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

 
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());
运行程序,你会发现列表控件的标题栏被重绘了。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值