Chinaunix首页 | 论坛 | 博客
  • 博客访问: 660965
  • 博文数量: 81
  • 博客积分: 1659
  • 博客等级: 上尉
  • 技术积分: 1286
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-02 16:36
个人简介

专注于嵌入式和图像处理

文章分类

全部博文(81)

文章存档

2014年(1)

2013年(7)

2012年(46)

2011年(27)

分类: C/C++

2012-10-07 11:33:25

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());
运行程序,你会发现列表控件的标题栏被重绘了。
阅读(1441) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~