无法使用互斥复选框实现树视图

时间:2014-12-18 18:09:47

标签: c winapi visual-c++ checkbox treeview

我需要实现具有以下行为的树视图:

当用户检查项目时,先前检查的项目将被取消选中。我不是以英语为母语的人,但我理解这种行为称为互斥复选框

我发现TVS_EX_EXCLUSIONCHECKBOXES extended style似乎符合我的需要,但我无法成功使用它。

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

  • 我已经链接了commctrl库并启用了视觉样式;
  • 我已初步化了常用控件;

以下是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的文档?

  • 如果没有,那么我的代码应该如何被修改为按照我之前描述的方式运行?
  • 如果是,请告诉我。

1 个答案:

答案 0 :(得分:3)

TVS_EX_xxx样式不是扩展窗口样式",它们是"扩展树视图样式"。它们只能使用TVM_SETEXTENDEDSTYLE消息进行设置。

TreeView_SetExtendedStyle(hwndTV,
           TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);