【问题标题】:Can't implement treeview with mutually exclusive checkboxes无法使用互斥复选框实现树视图
【发布时间】:2015-02-17 14:52:29
【问题描述】:

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

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

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

我通过使用SetWindowLongPtr 正确设置TVS_CHECKBOXES 样式,而不是像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 的文档?

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

【问题讨论】:

  • 对于未来的读者:你必须调用 TreeView_SetExtendedStyle 之前你设置TVS_CHECKBOXES风格!
  • 那么TVS_EX_EXCLUSIONCHECKBOXES 真的如你所愿吗?
  • @JonathanPotter:不,它没有。我想唯一的方法就是你之前推荐给我的那个……

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


【解决方案1】:

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

TreeView_SetExtendedStyle(hwndTV,
           TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);

【讨论】:

  • 感谢您回答波特先生。我已经复制/粘贴了您的代码,但仍然没有得到我需要的行为。我检查了TreeView_SetExtendedStyle 的返回码,它没有报告错误。我应该使用重新编写的代码来编辑我的帖子,还是你会自己解决这个问题?
  • 我怀疑TVS_EX_EXCLUSIONCHECKBOXES 没有做你认为的事情。我实际上不知道它的作用。我从未使用过它,而且似乎没有记录。
  • 确实,所有这些新样式的文档都很少。尝试使用部分复选框更改该样式,但也失败了。我会赞成您的回答,但会等待一段时间,看看其他人是否会有所启发。还是谢谢!
  • @AlwaysLearningNewStuff:我的意思是自己编写代码并不难。如果您只想要一次选择一个复选框,只需跟踪“已选中”项目,当检查新项目时,取消选中旧项目。 span>
  • 是的,我之前通过引入static 变量来做到这一点。我只是想试试这种风格,这样我就可以删除 static 变量...
猜你喜欢
  • 2021-05-03
  • 1970-01-01
  • 2018-01-02
  • 2015-10-05
  • 2015-02-05
  • 2011-12-06
  • 2011-12-26
  • 2011-12-16
  • 2015-04-13
相关资源
最近更新 更多