我需要实现一个具有以下行为的树形视图:
当用户勾选一个项目时,之前勾选的项目将取消勾选。我不是母语为英语的人,但我了解这种行为被称为“互斥复选框”。
我发现了似乎适合我的需求的TVS_EX_EXCLUSIONCHECKBOXES
扩展样式,但我无法成功使用它。
我通过使用SetWindowLongPtr
而不是像MSDN建议的直接传递给CreateWindowEx
来正确地设置TVS_CHECKBOXES
样式。然后我使用GetWindowLongPtr
和SetWindowLongPtr
来添加上面提到的扩展样式。代码编译通过,但运行时好像我从未添加过扩展样式。
- 我已经链接了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
的文档?
- 如果没有,那么我的代码应该如何修改才能按照我之前描述的方式运行?
- 如果是,那么请告诉我。
TVS_CHECKBOXES
样式之前,必须先调用 TreeView_SetExtendedStyle 函数! - AlwaysLearningNewStuffTVS_EX_EXCLUSIONCHECKBOXES
是否确实实现了你所期望的功能? - Jonathan Potter