在列表控件中添加复选框






4.45/5 (25投票s)
2000 年 1 月 10 日

326883
使用 IE3 及以上版本的更新列表控件,
列表视图为 GUI 设计师提供了许多选项。其中之一是能够以列的形式显示表格数据,对列进行排序,添加图像等等。这在 MFC 的 CListView 中得到了很好的实现。
复选框列表允许 GUI 设计师通过每个列表项上的复选框来获取用户选择的选项。这在 MFC 的 CCheckListBox 中得到了很好的实现。
如何将两者结合到一个控件中?
基本上,有两种选择:要么使用所有者绘制的列表视图控件,并绘制自己的复选框作为小图像;要么可以使用微软的 IE 3.0 中引入的新控件。要使用列表视图控件的新功能,您必须安装 IE 3.0(或更高版本)才能获得最新的 COMCTL32.DLL(通用控件库)。
此控件在 ListView 样式中引入了一些新的标志,并接受在 Windows 头文件中定义的某些宏。
请记住,新的标志和宏不会出现在 VC++ 4.2 帮助文件中,并且仅从 MSDN Jan 97 版本和 V++ 5.0 开始出现在帮助文件中。
好了,开始吧
首先,您必须在列表视图控件中设置新的样式。这可以通过以下方式完成
ListView_SetExtendedListViewStyle (m_lvTestList.m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
这会将列表视图设置为支持复选框,并支持全行选择(不仅仅是第一列)。
LVS_EX_CHECKBOXES | 该控件为每个项目提供复选框。您可以使用 ListView_GetCheckState 宏检索复选框的状态。 |
LVS_EX_FULLROWSELECT | 当选择一个项目时,其所有子项也会被显示为选中状态。单击任何子项将选择整行。此扩展样式仅与 LVS_REPORT 样式结合使用时有效。 |
LVS_EX_GRIDLINES | 在所有项目和子项周围显示虚线网格线。此扩展样式仅与 LVS_REPORT 样式结合使用时有效。 |
LVS_EX_HEADERDRAGDROP | 启用 ListView 中列的拖放重新排序。此扩展样式仅与 LVS_REPORT 样式结合使用时有效。 |
LVS_EX_SUBITEMIMAGES | 允许为子项显示图像。此扩展样式仅与 LVS_REPORT 样式结合使用时有效。 |
LVS_EX_TRACKSELECT | 启用 ListView 控件中项目的热跟踪。热跟踪,也称为悬停选择,意味着当鼠标指针悬停在其上超过 1 秒时,会自动选择一个项目。此样式适用于 ListView 控件的所有样式。 |
如何获取项目被选中/取消选中的通知
void DemoDlg::OnItemchangedLinksList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; *pResult = 0; if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0) return; // No change // Old check box state BOOL bPrevState = (BOOL)(((pNMListView->uOldState & LVIS_STATEIMAGEMASK)>>12)-1); if (bPrevState < 0) // On startup there's no previous state bPrevState = 0; // so assign as false (unchecked) // New check box state BOOL bChecked =
(BOOL)(((pNMListView->uNewState & LVIS_STATEIMAGEMASK)>>12)-1); if (bChecked < 0) // On non-checkbox notifications assume false bChecked = 0; if (bPrevState == bChecked) // No change in check box return; // Now bChecked holds the new check box state // .... }
要使此功能正常工作,您必须映射以下消息
ON_NOTIFY(LVN_ITEMCHANGED, IDC_MYLIST, OnItemchangedLinksList)
设置项目的复选框状态
尝试以下代码片段
void SetLVCheck (WPARAM ItemIndex, BOOL bCheck) { ListView_SetItemState (m_lvTestList.m_hWnd, ItemIndex, UINT((int(bCheck) + 1) << 12), LVIS_STATEIMAGEMASK); }
获取项目的复选框状态
使用在 commctl.h 中定义的宏 ListView_GetCheckState(hwndLV, i)
(hwndLV 是列表视图成员的窗口句柄 - 例如,m_lvTestList.m_hWnd
,i 是列表视图索引)