关闭

为listctrl控件换带背景表头

653人阅读 评论(0) 收藏 举报

1.       列表头控件时由列头和表格两部分构成,其中列头被定义为CHeaderCtrl类。只要重绘CHeaderCtrl类。首先创建一个CCustomHeader,其父类为CHeaderCtrl

2.       CCustomHeader类中处理WM_PAINT消息,在WM_PAINT消息处理函数中将位图绘制在控件上,然后获取当前列的数量,利用循环绘制每一列的标题

void CCustomHeader::OnPaint()

{

       CPaintDC dc(this);               //获取控件设备上下文

      

       int ItemCount = GetItemCount();         //获取列数

       CRect cRC;

       GetClientRect(&cRC);

 

       CBrush brush;               //定义画刷对象

       CBitmap bmp;                    

       bmp.LoadBitmap(IDB_H);   //加载位图

       brush.CreatePatternBrush(&bmp);        //创建位图画刷

       dc.FillRect(cRC,&brush);                    //利用位图画刷填充客户区域

 

       CPen pen(PS_SOLID,2,RGB(128,128,128));             //定义画笔对象

 

       for (int i = 0 ; i <ItemCount; i++)                                    //循环访问每一列

       {

              CRect rc;                                                         //定义一个区域对象

              GetItemRect(i,rc);                                            //获取列客户区域

 

              rc.DeflateRect(0,0,1,0);                                    //选中画笔对象

 

       //绘制分隔条

              dc.SelectObject(&pen);                                            //选中画笔对象

              dc.MoveTo(rc.right+1,0);                                         //绘制分隔条的起点

              dc.LineTo(rc.right+1,rc.Height());                             //绘制列之间的分割条

       //绘制文本

              char text[100];                                                        //定义一个字符数组,存储列标题

              memset(text,0,100);                                   //初始化字符数组

              CListCtrl* pList =  (CListCtrl*)this->GetParent();                   //获取列表控件

              if (pList != NULL)                                                  //判断列表是否为空

              {

                                  

                     LVCOLUMN col;                                             //定义一个列信息对象

                     memset(&col,0,sizeof(LVCOLUMN));               //初始化列信息对象

                     col.mask = LVCF_TEXT;                                  //设置文本标记

                     col.cchTextMax  = 100;                                   //设置最大文本长度

      

                     col.pszText = text;                                                   //设置文本缓冲区

                     pList->GetColumn(i,&col);                                      //获取列表列信息

                     dc.SetTextColor(RGB(255,150,0));                           //设置列表题颜色

 

                     CFont* font = GetFont();                                         //获取字体对象

                     dc.SelectObject(font);                                              //选中字体对象

                     dc.SetBkMode(TRANSPARENT);

                     dc.DrawText(text,rc,DT_CENTER      |DT_VCENTER|DT_WORD_ELLIPSIS|DT_SINGLELINE);   //绘制文本

              }

       }

       pen.DeleteObject();                                   //删除画笔对象

       bmp.DeleteObject();

       brush.DeleteObject();

}

 

然后可以创建一个自定义的类,其父类为CListCtrl,在自定义的类中添加一个成员变量m_Header.              CCustomHeader m_Header;

改写自定义类的PreSubClassWindow()虚方法,子类化列头

void CTipListCtrl::PreSubclassWindow()

{

       // TODO: Add your specialized code here and/or call the base class

       m_Header.SubclassWindow(GetHeaderCtrl()->m_hWnd);

       CListCtrl::PreSubclassWindow();

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3272次
    • 积分:61
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档