我需要实现具有以下行为的 TreeView :
当用户选中一个项目时,之前选中的项目将被取消选中。我的母语不是英语,但我知道这种行为称为互斥复选框。
我找到了 TVS_EX_EXCLUSIONCHECKBOXES
extended style这似乎符合我的需要,但我无法成功使用它。
我正在使用 SetWindowLongPtr
正确设置 TVS_CHECKBOXES
样式,而不是像 MSDN 推荐的那样简单地将它传递给 CreateWindowEx
。然后我使用 GetWindowLongPtr
和 SetWindowLongPtr
添加我上面提到的扩展样式。代码编译但运行时就好像我从未添加过扩展样式一样。
- 我已链接 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/