我需要实现具有以下行为的树视图:
当用户检查项目时,先前检查的项目将被取消选中。我不是以英语为母语的人,但我理解这种行为称为互斥复选框。
我发现TVS_EX_EXCLUSIONCHECKBOXES
extended style似乎符合我的需要,但我无法成功使用它。
我正在使用TVS_CHECKBOXES
正确设置SetWindowLongPtr
样式,而不是像MSDN推荐的那样简单地将其传递给CreateWindowEx
。然后我使用GetWindowLongPtr
和SetWindowLongPtr
添加我上面提到的扩展样式。代码编译但运行就像我从未添加过扩展样式一样。
以下是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
的文档?
答案 0 :(得分:3)
TVS_EX_xxx
样式不是扩展窗口样式",它们是"扩展树视图样式"。它们只能使用TVM_SETEXTENDEDSTYLE
消息进行设置。
TreeView_SetExtendedStyle(hwndTV,
TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);