使用本机 C++ 进行 windows vista 开发(4)

http://www.sina.com.cn 2008年06月13日 10:45  新浪科技

  标头控件和列表视图控件

  虽然只有相当少的开发人员直接使用标头控件,但几乎所有 windows 开发人员都熟悉列表视图控件,而列表视图控件在很大程度上依赖于标头控件来实现许多功能。在 windows vista 中,标头控件和列表视图控件都得到了增强。由于大多数开发人员都熟悉列表视图控件,因此,在本节中,我将从列表视图控件的角度着重介绍这些功能。不过,其中的许多功能不借助列表视图控件也可使用,而某些功能需要与标头控件直接交互。

  windows vista 中的列表视图控件已全面升级,具有许多新功能、样式和增强功能。与树视图控件不同,用于列表视图控件的扩展样式已推出相当长一段时间了。但是,Windows vista 定义了少数新的扩展样式,大大丰富了用户交互。

  当调整某一列的大小时,LVS_EX_AUTOSIZECOLUMNS 扩展样式可自动重新调整视图的列的大小,以适应视图中的各列。这是一个很好的功能,用户会非常喜欢,您可以轻松地添加该扩展样式。

  LVS_EX_AUTOCHECKSELECT 样式提供了在 Web 应用程序的表格式控件中常用的那种“全选”(Select All) 复选框。它与新的 HDS_CHECKBOXES 标头控件样式相对应。复选框被置于项目复选框上方的列标头中。单击该复选框可一次选中或取消选中所有列表视图项复选框。图 4 提供了一个与此相关的示例。

使用本机C++进行windowsvista开发(4)

图 4 列表视图全选控件

  对于树视图控件,要获取列表视图的 windows 资源管理器主题,您只需调用 SetWindowTheme 函数以便让 windows 使用与 windows 资源管理器一致的可视样式。

  LVS_EX_COLUMNSNAPPOINTS 扩展样式与 LVCOLUMN 结构添加项结合使用,可在用户重新调整特定列的大小时将该列迅速置于最小列宽。使用 LVS_EX_AUTOSIZECOLUMNS 扩展样式时也会提供此行为。要利用此功能,可添加上述任一扩展样式并相应地准备 LVCOLUMN 结构。例如,在以下示列中,插入了一个初始列宽为 200 像素、最小列宽为 100 像素的列:

  LVCOLUMN column = { 0 }; column.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_MINWIDTH; column.pszText = L”Name”; column.cx = 200; // initial width column.cxMin = 100; // minimum width m_listView.InsertColumn(0, &column);

  新的 LVCF_MINWIDTH 掩码用于指示 cxMin 字段已填充并表示该列的最小宽度。

  您可能已注意到 windows vista 中的另一个功能,即 windows 资源管理器可在所有视图而非仅在详细信息视图模式中显示列标题。默认情况下,标头控件仅在详细信息视图模式中可见。只需使用 LVS_EX_HEADERINALLVIEWS 扩展样式即可在所有视图模式中显示列标题。虽然用户会有点不习惯,但由于此功能允许用户在不同的视图模式下对视图排序,因此堪称一项很有用的功能。

  您还可能已经注意到,在不同视图模式下(如平铺视图模式),Windows 资源管理器中的列无法重新调整大小,水平滚动条亦不能用于使任何溢出的列标题显示在视图中。而在标头控件中,可显示溢出按钮。单击该按钮会显示一个弹出菜单,其中会列出因不可见而溢出的标题列。重复此行为需要执行若干步骤。

  首先,您需要将视图模式设置为除详细信息视图以外的任何模式,然后,需要使用 LVS_EX_HEADERINALLVIEWS 扩展样式来显示列标题。其次,您需要将 HDS_NOSIZING and HDS_OVERFLOW 样式添加到列表视图控件的标头控件中,具体代码如下所示:

  CHeaderCtrl header = m_listView.GetHeader(); DWORD headerStyle = header.GetStyle(); headerStyle |= HDS_NOSIZING | HDS_OVERFLOW; header.SetWindowLong(GWL_STYLE, headerStyle);

  HDS_NOSIZING 样式可禁用所有列的大小调整功能,HDS_OVERFLOW 样式可按需显示溢出按钮。最后,您需要处理 HDN_OVERFLOWCLICK 标头控件通知消息。在此步骤中,您可以向用户显示某种弹出窗口或菜单以表示溢出列。您还可能希望使用 TrackPopupMenu 函数来完成此功能。通过通知消息的 LPARAM 提供的 NMHEADER 结构的 iItem 数目为您提供了溢出的第一列的索引。

  标头控件提供的另一项新功能是拆分按钮。当鼠标悬停在列标题上时,列标题的外观与有关按钮控件一节中所述的拆分按钮很相似,显示一个下拉按钮。当为新列准备 LVCOLUMN 结构时,请使用 LVCFMT_SPLITBUTTON 格式标记。该格式标记与直接使用标头控件时 HDITEM 结构所使用的 HDF_SPLITBUTTON 格式标记相对应。按下下拉按钮时,LVN_COLUMNDROPDOWN 通知消息由列表视图控件发送。此通知消息与直接使用标头控件时所用的 HDN_DROPDOWN 通知消息相对应。LVN_COLUMNDROPDOWN 消息的 LPARAM 是一个指向 NMLISTVIEW 结构的指针,iSubItem 字段指示对其下拉列表执行了单击操作的列的索引。

  在 windows vista 中,列表视图控件的另一个改进方面是分组功能。图 5 显示了某些可应用到组中的新标签。用于定义列表视图组的 LVGROUP 结构规模已成倍增长。

使用本机C++进行windowsvista开发(4)

图 5 列表视图分组

  可按如下所示创建图 5 中的组:

  LVGROUP group = { sizeof(LVGROUP) }; group.mask = LVGF_GROUPID | LVGF_HEADER | LVGF_SUBTITLE | LVGF_TASK | LVGF_FOOTER | LVGF_STATE | LVGF_ALIGN; group.iGroupId = 1; group.pszHeader = L”Header”; group.pszSubtitle = L”Subtitle”; group.pszTask = L”Task”; group.pszFooter = L”Footer”; group.state = LVGS_COLLAPSIBLE; group.uAlign = LVGA_FOOTER_RIGHT | LVGA_HEADER_CENTER; m_listView.InsertGroup(-1, &group);

本文导航:
·前言
·按钮控件
·树视图控件
·标头控件和列表视图控件
·关于 .NET

发表评论 _COUNT_条
Powered By Google
不支持Flash
·城市对话改革30年 ·新浪城市同心联动 ·诚招合作伙伴 ·企业邮箱畅通无阻
不支持Flash