Rais Shaikh Ответов: 1

Как обрабатывать состояния tri-checkbox в ctreectrl в MFC?


Привет,
Я создал tri-state Ctreectrl в MFC, но при нажатии на флажок состояние не обновляется на одном экземпляре.
Например, я установил флажок, но с помощью GetItemState() я получаю 1 для каждого элемента. Если тот же самый пункт я снимаю, то меня проверяют. Итак, это возвращение старого состояния я пытаюсь получить новое состояние. Может ли кто-нибудь помочь мне каким-нибудь фрагментом кода ?

Что я уже пробовал:

Я поставил галочку на checkbox, но с помощью GetItemState() я получаю 1 для каждого элемента. Если тот же самый пункт я снимаю, то меня проверяют. Итак, это возвращение старого состояния, я пытаюсь получить новое состояние.

[Правка Йохена Арндта: скопировано из комментария]
ITreeCtrl m_FiletreeCtrl = DEBUG_NEW ITreeCtrl;
HTREEITEM hItem = m_FiletreeCtrl->GetTreeCtrl().HitTest(point, &flags);
HTREEITEM hItem2 = m_FilestreeCtrl->GetTreeCtrl().GetParentItem(hItem);
HTREEITEM hChildItem = NULL;
while(hItem22 != NULL)
{
    hChildItem = m_FilestreeCtrl->GetTreeCtrl().GetChildItem(hItem22);
    while(hChildItem)
    {
        UINT nCurrentState = (m_FilestreeCtrl->GetTreeCtrl().GetItemState(hChildItem,TVIS_STATEIMAGEMASK)>>0xC);
    }
}

В этом дереве я просто хочу знать, сколько элементов проверено, но GetItemState возвращает старое состояние.
[/РЕДАКТИРОВАТЬ]

Jochen Arndt

Где и когда вы вызываете GetItemState()?

Без просмотра используемого кода помочь невозможно.

Rais Shaikh

ITreeCtrl m_FiletreeCtrl = помощью debug_new ITreeCtrl;
HTREEITEM hItem = m_FiletreeCtrl->GetTreeCtrl().HitTest(point, &flags);
HTREEITEM hItem2 = m_FilestreeCtrl->GetTreeCtrl().GetParentItem(хитем);
HTREEITEM hChildItem = NULL;
while(hItem22 != NULL)
{
hChildItem = m_FilestreeCtrl->GetTreeCtrl().GetChildItem(hItem22);
пока(hChildItem)
{
UINT nCurrentState = (m_FilestreeCtrl->GetTreeCtrl().GetItemState(hChildItem,TVIS_STATEIMAGEMASK)>>0xC);
}
}

В этом дереве я просто хочу знать, сколько элементов проверено, но GetItemState возвращает старое состояние.

1 Ответов

Рейтинг:
12

Jochen Arndt

Код из комментария:

UINT nCurrentState = (m_FilestreeCtrl->GetTreeCtrl().GetItemState(hChildItem,TVIS_STATEIMAGEMASK)>>0xC);

Вы запрашиваете не состояние флажка, а индекс изображения состояния. Этот индекс определяет, какое изображение из списка изображений состояния действительно отображается. Условно нулевой индекс означает, что никакого образа состояния не существует. Индекс единицы (как вы определили) предназначен для непроверенного изображения. Смотреть также Как работать с индексами изображений состояний (Windows)[^].


Rais Shaikh

Спасибо за решение. Тогда как я получу выбранный счет из дерева.

Jochen Arndt

Добро пожаловать и благодарю вас за то, что вы приняли мое решение.

Вы должны перебирать узлы, начиная с корня (или любого определенного узла), и увеличивать переменную count при проверке элемента. Просто поищите в интернете что-нибудь вроде "ctreectrl iterate" или "ctreectrl enumerate".