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();
}