一、 实现过程 1.表头修改 新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
LRESULT
CHeaderCtrlCl::OnLayout(
WPARAM
wParam,
LPARAM
lParam )
{
LRESULT
lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;
RECT *prc = hdl.prc;
WINDOWPOS *pwpos = hdl.pwpos;
int
nHeight = (
int
)(pwpos->cy * m_Height);
pwpos->cy = nHeight;
prc->top = nHeight;
return
lResult;
}
|
2. 表的修改 新建一个MFC类CListCtrlCl,其基类为CListCtrl,定义一个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为自绘模式,然后子类化表头,代码如下:
1
2
3
4
5
6
7
8
|
void
CListCtrlCl::PreSubclassWindow()
{
ModifyStyle(0,LVS_OWNERDRAWFIXED);
CListCtrl::PreSubclassWindow();
CHeaderCtrl *pHeader = GetHeaderCtrl();
m_Header.SubclassWindow(pHeader->GetSafeHwnd());
}
|
添加成员变量,保存一些基本信息。
1
2
3
4
|
CPtrList m_ptrListCol;
CPtrList m_ptrListItem;
CPtrList m_colTextColor;
CPtrList m_ItemTextColor;
|
重载DrawItem()实现自绘,实现代码请参照代码。 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。
1
2
3
4
5
6
7
|
void
CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if
(m_nRowHeight>0)
{
lpMeasureItemStruct->itemHeight = m_nRowHeight;
}
}
|
添加消息处理OnMeasureItem()
1
2
3
4
5
|
void
CListCtrlCl::OnMeasureItem(
int
nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}
|
覆盖基类InsertColumn进行列信息保存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
int
CListCtrlCl::InsertColumn(
int
nCol,
LPCTSTR
lpszColumnHeading,
int
nFormat
,
int
nWidth
,
int
nSubItem
)
{
m_Header.m_HChar.Add(lpszColumnHeading);
if
(nFormat==LVCFMT_LEFT)
{
m_Header.m_Format = m_Header.m_Format +
"0"
;
}
else
if
(nFormat==LVCFMT_CENTER)
{
m_Header.m_Format = m_Header.m_Format +
"1"
;
}
else
if
(nFormat==LVCFMT_RIGHT)
{
m_Header.m_Format = m_Header.m_Format +
"2"
;
}
else
{
m_Header.m_Format = m_Header.m_Format +
"1"
;
}
return
CListCtrl::InsertColumn(nCol,lpszColumnHeading,nFormat,nWidth,nSubItem);
}
|
二、运行效果图如下: 三、使用方法 把HeaderCtrlCl.h, HeaderCtrlCl.cpp, ListCtrlCl.h, ListCtrlCl.cpp添加到你的工程中,在拖一个CListCtrl控件到对话框上,添加成员变量,然后在头文件中#include “ListCtrlCl.h”,把刚添加的成员变量类型改为 CListCtrlCl ,在对话框的OnInitDialog()中添加初始化代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
m_ListCtrl.SetColColor(0,RGB(10,150,20));
m_ListCtrl.SetColColor(2,RGB(30,100,90));
m_ListCtrl.SetBkColor(RGB(50,10,10));
m_ListCtrl.SetItemColor(1,1,RGB(100,100,10));
m_ListCtrl.SetRowHeigt(25);
m_ListCtrl.SetHeaderHeight(1.5);
m_ListCtrl.SetHeaderFontHW(16,0);
m_ListCtrl.SetHeaderTextColor(RGB(255,200,100));
m_ListCtrl.SetTextColor(RGB(0,255,255));
m_ListCtrl.SetHeaderBKColor(100,255,100,8);
m_ListCtrl.SetFontHW(15,0);
m_ListCtrl.SetColTextColor(2,RGB(255,255,100));
m_ListCtrl.SetItemTextColor(3,1,RGB(255,0,0));
|
|