改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景

本文介绍如何通过派生CListCtrl类来自定义其样式,包括表头高度、字体大小、列背景颜色等属性。
  • 转载VC:
    • 文章概要:
    • 用CListCtrl来显示数据比较方便,有时候我们需要标注某一列或某一个单元格的背景和字体颜色,或者需要改变一下行高和字体大小,CListCtrl要改变这些并不是很方便。本文将介绍如何派生一个类来改变CListCtrl及其表头的高度、字体大小、列背景颜色、单元格背景颜色、列字体颜色、单元格字体颜色。
    • 一、 实现过程

      1.表头修改

      新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下:

      01. LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam )
      02. {
      03. LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
      04. HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;
      05. RECT *prc = hdl.prc;
      06. WINDOWPOS *pwpos = hdl.pwpos;
      07. int nHeight = (int)(pwpos->cy * m_Height); //改变高度,m_Height为倍数
      08. pwpos->cy = nHeight;
      09. prc->top = nHeight;
      10. return lResult;
      11. }

      2. 表的修改

      新建一个MFC类CListCtrlCl,其基类为CListCtrl,定义一个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为自绘模式,然后子类化表头,代码如下:

      1. void CListCtrlCl::PreSubclassWindow()
      2. {
      3. // TODO: 在此添加专用代码和/或调用基类
      4. ModifyStyle(0,LVS_OWNERDRAWFIXED);
      5. CListCtrl::PreSubclassWindow();
      6. CHeaderCtrl *pHeader = GetHeaderCtrl();
      7. m_Header.SubclassWindow(pHeader->GetSafeHwnd());
      8. }

      添加成员变量,保存一些基本信息。

      1. CPtrList m_ptrListCol;  //保存列颜色
      2. CPtrList m_ptrListItem; //保存Item颜色表
      3. CPtrList m_colTextColor; //保存列字体颜色
      4. CPtrList m_ItemTextColor; //保存单元格字体颜色

      重载DrawItem()实现自绘,实现代码请参照代码。 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。

      1. void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
      2. {
      3. if (m_nRowHeight>0)
      4. {
      5. lpMeasureItemStruct->itemHeight = m_nRowHeight;
      6. }
      7. }

      添加消息处理OnMeasureItem()

      1. void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
      2. {
      3. // TODO: 在此添加消息处理程序代码和/或调用默认值
      4. CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
      5. }

      覆盖基类InsertColumn进行列信息保存

      01. int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
      02. int nFormat /* = LVCFMT_LEFT */,
      03. int nWidth /* = -1 */,
      04. int nSubItem /* = -1 */)
      05. {
      06. m_Header.m_HChar.Add(lpszColumnHeading);
      07. if (nFormat==LVCFMT_LEFT)
      08. {
      09. m_Header.m_Format = m_Header.m_Format + "0";
      10. }
      11. else if (nFormat==LVCFMT_CENTER)
      12. {
      13. m_Header.m_Format = m_Header.m_Format + "1";
      14. }
      15. else if (nFormat==LVCFMT_RIGHT)
      16. {
      17. m_Header.m_Format = m_Header.m_Format + "2";
      18. }
      19. else
      20. {
      21. m_Header.m_Format = m_Header.m_Format + "1";
      22. }
      23. returnCListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
      24. }

      二、运行效果图如下:

      三、使用方法

      把HeaderCtrlCl.h, HeaderCtrlCl.cpp, ListCtrlCl.h, ListCtrlCl.cpp添加到你的工程中,在拖一个CListCtrl控件到对话框上,添加成员变量,然后在头文件中#include “ListCtrlCl.h”,把刚添加的成员变量类型改为 CListCtrlCl ,在对话框的OnInitDialog()中添加初始化代码:

      01. m_ListCtrl.SetColColor(0,RGB(10,150,20)); //设置列背景色
      02. m_ListCtrl.SetColColor(2,RGB(30,100,90)); //设置列背景色
      03. m_ListCtrl.SetBkColor(RGB(50,10,10));        //设置背景色
      04. m_ListCtrl.SetItemColor(1,1,RGB(100,100,10)); //设置指定单元背景色
      05. m_ListCtrl.SetRowHeigt(25);               //设置行高度
      06. m_ListCtrl.SetHeaderHeight(1.5);          //设置头部高度
      07. m_ListCtrl.SetHeaderFontHW(16,0);   //设置头部字体高度,和宽度,0表示缺省,自适应
      08. m_ListCtrl.SetHeaderTextColor(RGB(255,200,100)); //设置头部字体颜色
      09. m_ListCtrl.SetTextColor(RGB(0,255,255));  //设置文本颜色
      10. m_ListCtrl.SetHeaderBKColor(100,255,100,8); //设置头部背景色
      11. m_ListCtrl.SetFontHW(15,0);               //设置字体高度,和宽度,0表示缺省宽度
      12. m_ListCtrl.SetColTextColor(2,RGB(255,255,100)); //设置列文本颜色
      13. m_ListCtrl.SetItemTextColor(3,1,RGB(255,0,0));  //设置单元格字体颜色

      四、结语

      本文仅介绍了一些主要的修改地方,详细请看源代码。对于修改类的不足和错误的地方请批评指正,本人十分感激。

      源代码下载地址:点击打开链接,源码下载


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值