无法使用互斥复选框实现 TreeView

标签 c winapi visual-c++ checkbox treeview

我需要实现具有以下行为的 TreeView :

当用户选中一个项目时,之前选中的项目将被取消选中。我的母语不是英语,但我知道这种行为称为互斥复选框

我找到了 TVS_EX_EXCLUSIONCHECKBOXES extended style这似乎符合我的需要,但我无法成功使用它。

我正在使用 SetWindowLongPtr 正确设置 TVS_CHECKBOXES 样式,而不是像 MSDN 推荐的那样简单地将它传递给 CreateWindowEx。然后我使用 GetWindowLongPtrSetWindowLongPtr 添加我上面提到的扩展样式。代码编译但运行时就好像我从未添加过扩展样式一样。

  • 我已链接 commctrl 库并启用视觉样式;
  • 我已经初始化了公共(public)控件;

下面是 WM_CREATE 处理程序。

case WM_CREATE:
{
    HWND hwndTV = CreateWindowEx(0, WC_TREEVIEW, L"tv", 
        WS_CHILD | WS_VISIBLE | WS_BORDER | 
        TVS_FULLROWSELECT | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT,
        50, 50, 150, 250, hWnd, (HMENU)4000, hInst, 0);

    // add checkbox

    DWORD dwStyle = GetWindowLongPtr(hwndTV, GWL_STYLE), 
        dwExStyle = GetWindowLongPtr(hwndTV, GWL_EXSTYLE);

    dwStyle |= TVS_CHECKBOXES;
    dwExStyle |= TVS_EX_EXCLUSIONCHECKBOXES;
    
    SetWindowLongPtr(hwndTV, GWL_STYLE, dwStyle);
    SetWindowLongPtr(hwndTV, GWL_EXSTYLE, dwExStyle);

    TVINSERTSTRUCT tvis = { 0 };
    
    tvis.item.mask = TVIF_TEXT;
    tvis.item.pszText = L"ROOT ITEM 1";
    HTREEITEM root1 = TreeView_InsertItem(hwndTV, &tvis);

    tvis.item.mask = TVIF_TEXT;
    tvis.item.pszText = L"ROOT ITEM 2";
    HTREEITEM root2 = TreeView_InsertItem(hwndTV, &tvis);

    tvis.item.mask = TVIF_TEXT;
    tvis.item.pszText = L"First child";
    tvis.hParent = root1;
    tvis.hInsertAfter = TVI_FIRST;
    HTREEITEM child1 = TreeView_InsertItem(hwndTV, &tvis);
}

问题:

我是否误解了 TVS_EX_EXCLUSIONCHECKBOXES 的文档?

  • 如果不是,那么我的代码应该如何修改才能像我之前描述的那样运行?
  • 如果是,请告诉我。

最佳答案

TVS_EX_xxx 样式不是“扩展窗口样式”,而是“扩展 TreeView 样式”。它们只能使用 TVM_SETEXTENDEDSTYLE 设置消息。

TreeView_SetExtendedStyle(hwndTV,
           TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);

关于无法使用互斥复选框实现 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27553008/

相关文章:

c++ - 如何用C++读取Windows默认网关IP地址

c - 在 C 中定义一个值是一个安全问题吗?

c++ - 在 c++ 中寻找 win7 64 位任务栏上的 DeskBand 工具栏示例

security - VB6 中的 CheckTokenMembership - 在 Windows 7 和 Windows 2008 上的 FreeSID 上崩溃

c# - 适用于 .NET 4.0 的 Permcalc.exe

c++ - 在 Visual C++ 中根据文件内容设置预处理器定义

c++ - 带有重载 lambda 的 std::variant,用 MSVC 替代?

c - 使用 dup2() 系统调用管道超过 3 个程序?

c - 仿射代码错误

c - mingw const char 字符串显然不是 const