CListCtrl的表头可以单独使用,类CHeaderCtrl封装了这一功能.
1. 构造表头
和所有控件一样,都通过Create函数创建对象,Create函数的原型如下:
virtual BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID)
参数说明:
rect是表头控件所在位置;
pParentWnd是表头的父窗体的指针,
nID是表头的资源ID号;
dwStyle是表头的风格样式,有下列值组合:
HDS_BUTTONS 表示表头控制外观类似按钮;
HDS_HORZ 表示表头控制为水平排列;
HDS_VERT 表示表头控制为垂直排列;
HDS_HIDDEN 表示表头控制为隐藏模式。
CCS_BOTTOM 设置控制位置在父窗口的底部并与父窗口同样宽度;
CCS_NODIVIDER 在控制顶部形成两个像素的高亮区;
CCS_NOHILITE 在控制顶部形成一个像素的高亮区;
CCS_NOMOVEY 在响应WM_SIZE消息时重置大小并水平排列;
CCS_NOPARENTALIGN 使控制自动靠近父窗口的顶部或底部;
CCS_NORESIZE 设置初始大小或新值时使控制使用默认宽度和高度;
CCS_TOP 设置在父窗口客户区域的顶部并与父窗口同样宽度;
也可以使用WND的风格.
创建了表头以后使用InsertItem添加列项,InsertItem函数原型如下:
int InsertItem(int nPos, HDITEM* phdi )
参数说明:
nPos是列序号,也就是列项在表头中的位置
phdi是一个结构体,列的属性取决于该结构体的设置,结构体原型是:
typedef struct _HD_ITEM
{
UINT mask; //结构成员有效控制位
int cxy; //表头项目的宽度
LPSTR pszText; //表头项目内容
HBITMAP hbm; //表头项目的位置句柄
int cchTextMax; //表头内容字符串长度
int fmt; //表头项目的格式
LPARAM lParam; //应用程序定义的32位数据
} HD_ITEM;
通常设置mask,cxy,pszText和fmt四个域.
mask设置以下值或值的组合表示如下含义:
HDI_BITMAP hbm成员有效
HDI_FORMAT fmt 成员有效
HDI_LPARAM lParam成员有效
HDI_TEXT pszText 和cchTextMax 成员有效
HDI_WIDTH cxy 成员有效并确定项目宽度值
fmt设置以下值或值的组合表示如下含义:
HDF_CENTER 表头项目居中
HDF_LEFT 表头项目左对齐
HDF_RIGHT 表头项目右对齐
HDF_BITMAP 表头显示一个位图
HDF_OWNERDRAW 由主窗口自绘表头项目
HDF_STRING 表头项目为一个字符串
其它成员函数不在此说明,请参考MSDN.
2. 控制表头
可以通过三个常用的消息控制表头,分别是:
HDN_ITEMCLICK 鼠标左键单击表头中的列
NM_RCLICK 鼠标右键单击表头中的列,右键弹出菜单可以在此消息的控制函数中实现
HDN_ITEMCHANGED 拖动列的边界,改变列大大小
这三个消息都以ON_NOTIFY()发送,消息处理函数原型为void FunName(NMHDR* pNMHDR, LRESULT* pResult)
在消息处理函数中,通过成员函数GetHeaderCtrl()获得表头的指针pHead,调用成员函数GetItem()获得属性值,给一示例:
NMHEADER *pHdr = (NMHEADER*)pNMHDR;
CHeaderCtrl *pHeader = m_cListCtrl.GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_WIDTH;
pHeader->GetItem(pHdr->iItem, &hdi);
hdi.cxy就是触发消息的列的宽度.
还有许多消息可以控制表头,使用方法同上:
HDN_ITEMDBLCLICK 左键双击表头的列项
HDM_SETITEM 设置表头列的属性
HDN_DIVIDERDBLCLICK 左键双击列与列的分割区域