Здравствуйте, abr, Вы писали:
abr>Здравствуйте!
abr>Извесно что у контрола CheckBox при установленом стиле BS_3STATE кроме checked и unchecked состояний, появляется третие состояние 'grayed'.
abr>А вот в CTreeViewCtrl c checkbox'amи состояний у чекбоксов только 2 checked и unchecked...
abr>Вот собсно и вопрос, как сделать чтоб появилось третье состояние?
abr>Или может у кого уже готовый контрл найдётся...
Это же секретная информация, уже не однократно обсуждавшаяся на форуме!
Флажки у CTreeCtrl по сути всего лишь иконки. Они храняться в списке, который можно получить как CTreeCtrl::GetImageList(TVSIL_STATE). Система при инициализации контрола стилем TVS_CHECKBOXES создаёт этот ImageList и наполняет его всего 2мя иконками.
Поэтому самостоятельно при инициализации своего контрола добавляешь в ImageList третью иконку. Можешь из ресурсов программы, или динамически, нарисовав при помощи функции DrawFrameControl(

). Потом переписываешь функции установки\возвращения состояния флажка. Что-то типа:
enum
{
unchecked = 0,
checked,
half_checked
};
bool CMyTreeCtrl::SetCheck(HTREEITEM hItem, int nCheck /* = checked */)
{
CImageList * pImageList = GetImageList(TVSIL_STATE);
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_STATE;
item.hItem = hItem;
item.stateMask = TVIS_STATEIMAGEMASK;
item.state = INDEXTOSTATEIMAGEMASK(nCheck); // вместо item.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1));
return ::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item) != 0;
}
UINT CMyTreeCtrl::GetCheck(HTREEITEM hItem) const
{
ASSERT(::IsWindow(m_hWnd));
TVITEM item;
item.mask = TVIF_HANDLE | TVIF_STATE;
item.hItem = hItem;
item.stateMask = TVIS_STATEIMAGEMASK;
VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
return (UINT)(item.state >> 12); // вместо return ((BOOL)(item.state >> 12) -1);
}
Только никому не рассказывай