Не удается реализовать 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 2

1 ответ:

TVS_EX_xxx стили-это не "расширенные стили окон", а "расширенные стили treeview". Они могут быть установлены только с помощью TVM_SETEXTENDEDSTYLE сообщение.

TreeView_SetExtendedStyle(hwndTV,
           TVS_EX_EXCLUSIONCHECKBOXES, TVS_EX_EXCLUSIONCHECKBOXES);