clistctrl

用CListCtrl来显示数据比较方便,有时候我们需要标注某一列或某一个单元格的背景和字体颜色,或者需要改变一下行高和字体大小,CListCtrl要改变这些并不是很方便。本文将介绍如何派生一个类来改变CListCtrl及其表头的高度、字体大小、列背景颜色、单元格背景颜色、列字体颜色、单元格字体颜色。


一、 实现过程

1.表头修改

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

  1. LRESULT CHeaderCtrlCl::OnLayout( WPARAM wParam, LPARAM lParam )  
  2. {  
  3.     LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);   
  4.     HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;   
  5.     RECT *prc = hdl.prc;   
  6.     WINDOWPOS *pwpos = hdl.pwpos;   
  7.   
  8.     //表头高度为原来1.5倍,如果要动态修改表头高度的话,将1.5设成一个全局变量   
  9.     int nHeight = (int)(pwpos->cy * m_Height);  
  10.     pwpos->cy = nHeight;   
  11.     prc->top = nHeight;   
  12.     return lResult;   
  13. }  

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.   
  5.     CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);  
  6. }  

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

  1. int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat /* = LVCFMT_LEFT */int nWidth /* = -1 */int nSubItem /* = -1 */)  
  2. {  
  3.     m_Header.m_HChar.Add(lpszColumnHeading);  
  4.     if (nFormat==LVCFMT_LEFT)  
  5.     {  
  6.         m_Header.m_Format = m_Header.m_Format + "0";  
  7.     }  
  8.     else if (nFormat==LVCFMT_CENTER)  
  9.     {  
  10.         m_Header.m_Format = m_Header.m_Format + "1";  
  11.     }  
  12.     else if (nFormat==LVCFMT_RIGHT)  
  13.     {  
  14.         m_Header.m_Format = m_Header.m_Format + "2";  
  15.     }  
  16.     else  
  17.     {  
  18.         m_Header.m_Format = m_Header.m_Format + "1";  
  19.     }  
  20.     return CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);  
  21. }  


二、运行效果图如下:

三、使用方法

把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)); //设置单元格字体颜色

四、结语

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

Email:qvb20974151@163.com

源码地址:http://download.csdn.net/detail/qing666888/7970795

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页