【发布时间】:2015-02-17 14:52:29
【问题描述】:
我需要实现具有以下行为的树视图:
当用户选中一个项目时,之前选中的项目会被取消选中。我不是以英语为母语的人,但我知道这种行为称为互斥复选框。
我发现TVS_EX_EXCLUSIONCHECKBOXES extended style 似乎适合我的需要,但我无法成功使用它。
我通过使用SetWindowLongPtr 正确设置TVS_CHECKBOXES 样式,而不是像MSDN 推荐的那样简单地将其传递给CreateWindowEx。然后我使用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 的文档?
- 如果不是,那么应该如何修改我的代码以按照我之前描述的方式运行?
- 如果是,请告诉我。
【问题讨论】:
-
对于未来的读者:你必须调用 TreeView_SetExtendedStyle 之前你设置
TVS_CHECKBOXES风格! -
那么
TVS_EX_EXCLUSIONCHECKBOXES真的如你所愿吗? -
@JonathanPotter:不,它没有。我想唯一的方法就是你之前推荐给我的那个……
标签: c winapi visual-c++ checkbox treeview