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());
 
运行程序,你会发现列表控件的标题栏被重绘了。

你可能感兴趣的:(职场,休闲,CListCtrl)