c - 如何将ListView复选框与选择同步?(WIN32)

标签 c windows listview winapi win32gui

我正在编写一个简单的 Win32 程序,它有一个启用了复选框和多行选择的 ListView。 : enter image description here

复选框检查和行选择似乎是两种不同的行为。有没有办法同步这两种行为,每当选中一个复选框时,就会选择该行,并且每当选择一行时,都会选中相应的复选框?

最佳答案

“每当选择一行时,相应的复选框就会被选中”

检查WM_NOTIFYLVIS_SELECTED 标志来检测用户何时选择一行。并使用ListView_SetCheckState选中复选框:

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hListView;
    switch (msg)
    {
    case WM_INITDIALOG:
        hListView = GetDlgItem(hWnd, IDC_LIST1);
        break;

    case WM_NOTIFY:
    {
        NMHDR* header = (NMHDR*)lParam;
        NMLISTVIEW* nmlist = (NMLISTVIEW*)lParam;
        if (header && header->idFrom == IDC_LIST1 && header->code == LVN_ITEMCHANGED)
            if (nmlist->uNewState & LVIS_SELECTED)
                ListView_SetCheckState(hListView, nmlist->iItem, 1);
        break;
    }
    ...
}

“每当选中复选框时,就会选择该行”

检查 WM_NOTIFYLVIS_STATEIMAGEMASK 标志以检测复选框何时被选中,然后使用 ListView_SetItemState 选择该行。

这也可能导致递归调用,因为我们更改行以响应复选框,并且我们更改复选框以响应行选择。使用 busy 变量停止递归调用。

case WM_NOTIFY:
    if (lParam)
    {
        NMHDR* header = (NMHDR*)lParam;
        NMLISTVIEW* nmlist = (NMLISTVIEW*)lParam;

        //use `busy` as a flag to prevent recursive calls:
        static BOOL busy = FALSE;
        if (!busy && header->hwndFrom == hListView && header->code == LVN_ITEMCHANGED)
        {
            busy = TRUE;
            if (nmlist->uNewState & LVIS_SELECTED)
            {
                //row has been selected => check the checkbox
                ListView_SetCheckState(hListView, nmlist->iItem, 1);
            }
            else if (nmlist->uNewState & LVIS_STATEIMAGEMASK)
            {
                //checkbox has been changed => select/unselect the row
                BOOL checked = ListView_GetCheckState(hListView, nmlist->iItem);
                ListView_SetItemState(hListView, nmlist->iItem,
                     checked ? LVIS_SELECTED : 0, LVIS_SELECTED);
            }
            busy = FALSE;
        }
    }
    break;

关于c - 如何将ListView复选框与选择同步?(WIN32),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37356042/

相关文章:

android - 在 android 中过滤 ListView 时检查了错误的项目

c - 程序不工作: Segmentation fault is occur

C Shell 执行命令

C#从上下文菜单Windows资源管理器中选定的文件/文件夹中检索文件/文件夹路径

c++ - 使用动态分配的变量和 _chdir windows 函数时堆损坏

java - ListView 不工作?

c - 结构声明末尾的这个 [1] 的目的是什么?

c - 静态链接库。 c编译

windows - 隐藏窗口截图

c# - C#中如何清除 ListView 中的数据