使用由 CHeaderCtrl 类表示的标头控件显示纵栏式列表的列标头。例如,标头控件对于实现电子表格中的列控件应该很有用。
标头控件通常分为叫做“标头项”的各个部分,每个部分有一个关联文本或数字列的标题。根据设置的样式,可以为用户提供若干操作标头项的直接方式。
注意 CListCtrl 提供嵌入标头控件,而 CListView 在 MFC 类中封装 CListCtrl。通常,可考虑使用 CHeaderCtrl 为想要自己绘制的列表加标签。
标头控件和列表控件 (List Control)
大多数情况下,使用嵌入 CListCtrl 或 CListView 对象中的标头控件。但在某些情况中,最好使用单独的标头控件对象,如操作 CView 派生的对象中按行或列排列的数据。在这些情况下,需要进一步控制嵌入标头控件的外观和默认行为。
通常情况下,当希望标头控件提供标准的默认行为时,可能需要改用 CListCtrl 或 CListView。当需要嵌入列表视图公共控件中的默认标头控件功能时,使用 CListCtrl。当需要嵌入视图对象中的默认标头控件功能时,使用 CListView。
注意 如果列表视图 (ListView) 控件是使用 LVS_REPORT 样式创建的,则这些控件只包含内置标头控件。
大多数情况下,可以通过更改包含列表视图 (ListView) 控件的样式来修改嵌入标头控件的外观。另外,可以通过父列表视图 (ListView) 控件的成员函数获取有关标头控件的信息。但是,若要完全控制和访问嵌入标头控件的属性和样式,建议获取指向标头控件对象的指针。
可通过调用各自类的 GetHeaderCtrl 成员函数,从 CListCtrl 或 CListView 访问嵌入标头控件对象。以下代码对此进行了说明:
CListCtrl& refList = GetListCtrl();
CHeaderCtrl* pCtrl = refList.GetHeaderCtrl();
ASSERT(pCtrl != NULL);
//perform any needed operations on the header
//using pHeader
标头控件示例
LISTHDR 示例应用程序对列表视图 (ListView) 控件(由 CListCtrl 对象实现)和嵌入标头控件(由 CHeaderCtrl 对象实现)的各种属性和样式进行了说明。
有关标头控件的示例,请参见“资源管理器”中的右边窗格和 Platform SDK 中的主题标头控件。
标头控件中的标头项
您对组成标头控件 (CHeaderCtrl) 的标头项的外观和行为有相当大的控制。每个标头项可以包含一个字符串,一个位图图像,一个来自关联图像列表的图像,或一个关联应用程序定义的 32 位值。字符串、位图或图像显示在标头项中。
如果新项是通过调用 CHeaderCtrl::InsertItem 或通过修改现有项创建的,可以调用 CHeaderCtrl::GetItem 和 CHeaderCtrl::SetItem 自定义新项的外观和内容。
自定义标头项的外观
通过在首次创建标头控件 (CHeaderCtrl::Create) 时设置 dwStyle 参数,可以定义标头项或标头控件本身的外观和行为。
以下是可以设置的样式的取样及其用途:
- 若要使标头项看上去像一个普通按钮,请使用 HDS_BUTTONS 样式。
如果要采取操作以响应标头项上的鼠标单击(如按照特定的列对数据进行排序,像在 Microsoft Outlook 中那样),请使用此样式。
- 若要在鼠标光标经过标头项时给予标头项“热跟踪”的外观,请使用 HDS_HOTTRACK 样式。
当指针经过本来是平面的栏中的项时,热跟踪显示三维轮廓。
- 若要指示应隐藏标头控件,请使用 HDS_HIDDEN 样式。
HDS_HIDDEN 样式指示标头控件用作数据容器而不是可视控件。此样式不自动隐藏控件,但却影响 CHeaderCtrl::Layout 的行为。WINDOWPOS 结构的 cy 成员中返回的值将是零,表示不应该让用户看到此控件。
有关这些属性的更多信息,请参见 Platform SDK 中的 Items。有关将项添加到标头控件中的更多信息,请参见向标头控件添加项。
为标头项提供拖放支持
若要为标头项提供拖放支持,请指定 HDS_DRAGDROP 样式。对标头项的拖放支持使用户得以对标头控件中的标头项进行重新排序。默认行为可为正被拖动的标头项提供半透明拖动图像,如果放下标头项,还提供新位置的可视指示器。
与普通的拖放功能一样,可以通过处理 HDN_BEGINDRAG 和 HDN_ENDDRAG 通知来扩展默认拖放行为。还可以通过重写 CHeaderCtrl::CreateDragImage 成员函数自定义拖动图像的外观。
注意 如果为列表控件中的嵌入标头控件提供拖放支持,请参见更改列表控件 (List Control) 样式主题中的“扩展样式”一节。
在标头控件中使用图像列表
标头项可以在标头项内显示图像。此图像存储在关联的图像列表中,为 16 x 16 像素大小,其特征与用于列表视图 (ListView) 控件的图标图像相同。若要成功实现此行为,必须首先创建并初始化图像列表,将列表与标头控件相关联,然后修改将显示图像的标头项的属性。
以下过程阐释了使用指向标头控件 (m_pHdrCtrl) 的指针和指向图像列表 (m_pHdrImages) 的指针的详细信息。
在标头项中显示图像
1. 通过使用 CImageList 构造函数和存储所得到的指针来构造新的图像列表(或使用现有图像列表对象)。
2. 通过调用 CImageList::Create 初始化新的图像列表对象。以下代码是此调用的一个示例。
m_pHdrImages->Create(16, 16, ILC_MASK, 2, 2);
3. 为每个标头项添加图像。以下代码添加两个预定义图像。
m_pHdrImages->Add(pApp->LoadIcon(IDI_ICONHDR1));
m_pHdrImages->Add(pApp->LoadIcon(IDI_ICONHDR2));
4. 调用 CHeaderCtrl::SetImageList 将图像列表与标头控件相关联。
5. 修改标头项以显示来自关联图像列表的图像。以下示例将 m_phdrImages 中的第一个图像分配给第一个标头项 m_pHdrCtrl。
HDITEM curItem;
m_pHdrCtrl->SetImageList(m_pHdrImages);
m_pHdrCtrl->GetItem(0, &curItem);
curItem.mask= HDI_IMAGE | HDI_FORMAT;
curItem.iImage= 0;
curItem.fmt= HDF_LEFT | HDF_IMAGE | HDF_STRING;
m_pHdrCtrl->SetItem(0, &curItem);
有关所使用的参数值的详细信息,请参考有关的 CHeaderCtrl。
注意 可能有多个控件使用同一个图像列表。例如,在标准列表视图 (ListView) 控件中,可能有一个(16 x 16 像素大小图像的)图像列表同时由列表视图 (ListView) 控件的小图标视图和列表视图 (ListView) 控件的标头项使用。
创建所有者描述的标头控件
可以将标头控件 (CHeaderCtrl) 的个别项定义为所有者描述的项。有关更多信息,请参见 Platform SDK 中的所有者描述的标头控件。
使用标头控件
使用标头控件 (CHeaderCtrl) 的捷径是与列表控件 (List Control) 一起使用;请参见本系列主题中稍后介绍的使用 CListCtrl。也可以单独使用标头控件。MFC 为您调用 InitCommonControls。主要任务如下:
如果标头控件对象嵌在父视图或对话框类中,则销毁父级时将销毁控件。
创建标头控件
标头控件不能直接在对话框编辑器中使用(但可以添加包含标头控件的列表控件 (List Control))。
将标头控件放入对话框
1. 在对话框类中手动嵌入 CHeaderCtrl 类型的成员变量。
2. 在 OnInitDialog 中创建并设置 CHeaderCtrl 的样式,定位并显示它。
3. 向标头控件添加项。
4. 对于需要处理的任何标头控件通知消息,使用“属性”窗口在对话框类中映射处理函数(请参见将消息映射到函数)。
将标头控件放入视图(不是 CListView)
1. 在视图类中嵌入 CHeaderCtrl 对象。
2. 在视图的 OnInitialUpdate 成员函数中设置样式、定位并显示标头控件窗口。
3. 向标头控件添加项。
4. 对于需要处理的任何标头控件通知消息,使用“属性”窗口在视图类中映射处理函数(请参见将消息映射到函数)。
在任一情况中,创建视图或对话框对象时都创建嵌入的控件对象。然后必须调用 CHeaderCtrl::Create 创建控件窗口。若要定位控件,请调用 CHeaderCtrl::Layout 确定控件的初始大小和初始位置,并调用 SetWindowPos 设置所需位置。然后如向标头控件添加项中所述添加项。
有关更多信息,请参见 Platform SDK 中的创建标头控件。
向标头控件添加项
在标头控件的父窗口中创建标头控件 (CHeaderCtrl) 后,添加所需数量的“标头项”:通常一列一项。
添加标头项
1. 准备 HD_ITEM 结构。
2. 传递该结构来调用 CHeaderCtrl::InsertItem。
3. 重复步骤 1 和步骤 2 添加其他项。
有关更多信息,请参见 Platform SDK 中的将项添加到标头控件。
排序标头控件中的项
完成向标头控件添加项后,可以使用下列函数操作或获取这些项的顺序信息:
- CHeaderCtrl::GetOrderArray 和 CHeaderCtrl::SetOrderArray
检索并设置从左向右排序的标头项。
- CHeaderCtrl::OrderToIndex.
检索特定标头项的索引值。
除了先前的成员函数外,HDS_DRAGDROP 样式还使用户可以在标头控件中拖放标头项。有关更多信息,请参见为标头项提供拖放支持。
处理标头控件通知
在视图或对话框类中,使用“属性”窗口为要处理的任何标头控件 (CHeaderCtrl) 通知消息创建带 switch 语句的 OnChildNotify 处理函数(请参见将消息映射到函数)。用户单击或双击标头项、拖动项之间的分隔符或进行其他操作时,将向父窗口发送通知。
在 Platform SDK 中的标头控件参考中列出了与标头控件相关联的通知消息。