Не удается реализовать treeview с взаимоисключающими флажками
Мне нужно реализовать treeview со следующим поведением:
Когда пользователь проверяет элемент, ранее проверенные элементы снимаются. Я не носитель английского языка, но я понимаю, что это поведение называетсявзаимоисключающие флажки .
Я нашел TVS_EX_EXCLUSIONCHECKBOXES
расширенный стиль , который, казалось, удовлетворял моим потребностям, но я не могу использовать его успешно.
Я правильно устанавливаю стиль TVS_CHECKBOXES
, используя SetWindowLongPtr
вместо того, чтобы просто передавать его в CreateWindowEx
как MSDN рекомендуемый. Затем я использую 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
?
- если нет, то как мой код должен быть изменен, чтобы вести себя так, как я описанные ранее? Если да, то, пожалуйста, скажите мне об этом.
1 ответ:
TVS_EX_xxx
стили-это не "расширенные стили окон", а "расширенные стили treeview". Они могут быть установлены только с помощьюTVM_SETEXTENDEDSTYLE
сообщение.TreeView_SetExtendedStyle(hwndTV, TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);