- 浏览: 74683 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景
摘要
用CListCtrl来显示数据比较方便,有时候我们需要标注某一列或某一个单元格的背景和字体颜色,或者需要改变一下行高和字体大小,CListCtrl要改变这些并不是很方便。本文将介绍如何派生一个类来改变CListCtrl及其表头的高度、字体大小、列背景颜色、单元格背景颜色、列字体颜色、单元格字体颜色。
关键字: 自绘 子类化 颜色 CListCtrl CHeaderCtrl
一、 实现过程
1.表头修改
新建一个MFC类CHeaderCtrlCl,其基类为CHeaderCtrl,响应OnPaint消息实现自绘,实现代码请看源代码(由于代码较占篇幅,所以就不贴上来了,抱歉),在头文件中定义函数
LRESULT OnLayout( WPARAM wParam, LPARAM lParam ),之后手动添加消息响应ON_MESSAGE(HDM_LAYOUT, OnLayout),在消息响应中改变高度,实现代码如下:
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); //改变高度,m_Height为倍数 pwpos->cy = nHeight; prc->top = nHeight; return lResult; }
2. 表的修改
新建一个MFC类CListCtrlCl,其基类为CListCtrl,定义一个CHeaderCtrlCl的成员变量m_Header,重载PreSubclassWindow(),在函数中修改控件类型为自绘模式,然后子类化表头,代码如下:
void CListCtrlCl::PreSubclassWindow() { // TODO: 在此添加专用代码和/或调用基类 ModifyStyle(0,LVS_OWNERDRAWFIXED); CListCtrl::PreSubclassWindow(); CHeaderCtrl *pHeader = GetHeaderCtrl(); m_Header.SubclassWindow(pHeader->GetSafeHwnd()); }
添加成员变量,保存一些基本信息。
CPtrList m_ptrListCol; //保存列颜色 CPtrList m_ptrListItem; //保存Item颜色表 CPtrList m_colTextColor; //保存列字体颜色 CPtrList m_ItemTextColor; //保存单元格字体颜色
重载DrawItem()实现自绘,实现代码请参照代码。 手动添加消息宏ON_WM_MEASUREITEM_REFLECT(),添加下面的函数,实现修改行高。
void CListCtrlCl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) { if (m_nRowHeight>0) { lpMeasureItemStruct->itemHeight = m_nRowHeight; } }
添加消息处理OnMeasureItem()
void CListCtrlCl::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CListCtrl::OnMeasureItem(nIDCtl, lpMeasureItemStruct); }
覆盖基类InsertColumn进行列信息保存
int CListCtrlCl::InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat /* = LVCFMT_LEFT */, int nWidth /* = -1 */, int nSubItem /* = -1 */) { 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()中添加初始化代码:
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); //设置头部字体高度,和宽度,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); //设置字体高度,和宽度,0表示缺省宽度 m_ListCtrl.SetColTextColor(2,RGB(255,255,100)); //设置列文本颜色 m_ListCtrl.SetItemTextColor(3,1,RGB(255,0,0)); //设置单元格字体颜色
发表评论
-
自己写的一段customerDraw
2010-08-24 16:20 1906void CNewReportPage::OnNMCustom ... -
帖BitMap
2010-08-24 09:42 803void CEx_14View::O ... -
clistctrl +号按钮绘制
2010-08-11 17:18 1615网上有关clistctrl举不胜举,包括按钮控件的绘 ... -
listctrl总结2
2010-08-11 17:11 101120. listctrl的subitem添加图标 ... -
VC中使用ListCtrl经验总结(1)
2010-08-11 17:07 1353ListCtrl在工作中,常常用到,也常常看到大家发帖问怎么用 ... -
LV_COLUMN结构体
2010-08-10 14:44 2750typedef struct _LV_COLUMN {UINT ... -
加载位图BITMAP
2010-08-10 14:27 1480m_Bitmap.LoadBitmap(IDB_BITMAP1 ... -
关于控件重绘函数/消息 OnPaint,OnDraw,OnDrawItem,DrawItem的区别
2010-08-10 13:15 6501而OnPaint()是CWnd的类成员,同时负责响应WM_ ... -
listctrl 重绘
2010-08-10 10:15 1093common control 4.7版本介绍 ... -
OnCreate PreCreateWindow PreSubclassWindow
2010-08-09 17:47 1802OnCreate PreCreateWindow PreSub ... -
扩展CListCtrl实现颜色长度改变
2010-08-09 17:34 3246用CListCtrl来显示数据比较方便,有时候我们需要标注某一 ... -
创建CListCtrl中的排序小图标
2010-08-09 17:11 2346创建CListCtrl中的排序小图标 for(int i = ... -
CListCtrl控件的使用
2010-08-09 17:02 1226初始化: DWORD dwStyle; dwStyle = m ... -
CHeaderCtrl用法
2010-08-09 15:47 4284CListCtrl的表头可以单独 ... -
CListCtrl::SortItems的用法:
2010-08-09 12:37 2030CListCtrl::SortItems的用法: (一)So ... -
树型视的三个结构TVINSERTSTRUCT、TVITEM、NMTREEVIEW
2010-08-05 18:11 1005TVINSERTSTRUCT包含添加新项到树形视控件所使用的信 ... -
剪贴板和OLE拖放
2010-08-05 16:35 1201一、传统剪贴板 ... -
文档/视图结构中的各个部分是如何联系到一起的
2010-08-05 15:39 784文档/视图结构是MFC中最有特色而又有难度的部分,在这当中涉及 ... -
MFC一些函数区别
2010-08-05 13:43 1704GetMessagePos GetCursorPos的区别 ... -
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
2010-08-05 13:33 1074UNICODE:它是用两个字节 ...
相关推荐
总结来说,自定义MFC的CListCtrl涉及到字体、颜色和背景的设置,以及对CHeaderCtrl的控制。这需要对MFC的消息机制、GDI绘图以及数据绑定有深入理解。通过熟练掌握这些技巧,开发者能够创建出功能强大且视觉效果出色...
本实例将详细介绍如何利用重用类改变CListCtrl的高度、字体、颜色以及背景,以实现自定义的界面效果。我们将主要探讨以下几个方面: 1. **CListCtrl的基本操作**: - CListCtrl是MFC中的一个视图类,它继承自CWnd...
本文将介绍如何派生一个类来改变CListCtrl及其表头的高度、字体大小、列背景颜色、单元格背景颜色、列字体颜色、单元格字体颜色。 通过改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景,重载函数实现!
在这个"改变CListCtrlCHeaderCtrl高度字体颜色和背景增强版"的主题中,我们将探讨如何自定义这些控件的视觉样式,包括调整列头的高度、修改字体颜色以及改变背景颜色,从而提升用户界面的美观性和可用性。...
1. 设置默认背景颜色,默认字体颜色,默认选中字体颜色,默认选中背景颜色(四种颜色) 2. 设置特定单元格的四种颜色,当插入删除行或列时,特定单元格的颜色不变。 3. 设置默认字体(所有单元格字体一致) 4. 绘制...