现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

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

2012-08-16 13:37 工业·编程 ⁄ 共 3045字 ⁄ 字号 暂无评论

一、 实现过程

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.}

二、运行效果图如下:

clip_image001

三、使用方法

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

四、结语

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

给我留言

留言无头像?