65.9K
CodeProject 正在变化。 阅读更多。
Home

在列表控件中添加复选框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (25投票s)

2000 年 1 月 10 日

viewsIcon

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_hWndi 是列表视图索引)

© . All rights reserved.