Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > TreeView и checkbox с 3 состояниями


Автор: Qwe2 16.8.2012, 15:17
Нужно сделать TreeView с checkbox'ами с тремя состояниями. Вроде бы в этом случае вмсето чекбоксов по умолчанию нужно использовать иконки: то есть заполнить image-list 3 иконками галок. Где-то видел, что эти иконки можно извлечь из системы (из обычного чекбокса) и ими заполнить image-list. Чтобы не файлы ico|bmp использовать. Как это можно сделать?

Автор: GremlinProg 16.8.2012, 15:22
можно нарисовать:
Код

DrawFrameControl( hdc, pRect, DFC_BUTTON, DFCS_BUTTON3STATE );

или с DFCS_BUTTONCHECK vs DFCS_HOT, DFCS_PUSHED, DFCS_CHECKED

Автор: Qwe2 16.8.2012, 16:30
А как добавить в image-list?

Автор: GremlinProg 16.8.2012, 16:57
Цитата(Qwe2 @  16.8.2012,  18:30 Найти цитируемый пост)
А как добавить в image-list?

нарисовать в битмап и добавить этот битмап

но можно просто рисовать на custom-draw TreeView, без image-list'а

Автор: feodorv 17.8.2012, 00:38
Честно говоря, тему подзабыл. То, что помню:
  • установить стиль TVS_CHECKBOXES, при этом система сама создаст image-list;
  • менять состояние state элемента (0 - нет чекбокса, 1 - есть неотмеченный, 2 - есть отмеченный.

Код примерно такой:
Код

BOOL TreeView_SetCheckState(HWND hwndTreeView, HTREEITEM hItem, BOOL fCheck)
{
    TVITEM tvItem;

    tvItem.mask = TVIF_HANDLE | TVIF_STATE;
    tvItem.hItem = hItem;
    tvItem.stateMask = TVIS_STATEIMAGEMASK;

    /*Image 1 in the tree-view check box image list is the
    unchecked box. Image 2 is the checked box.*/
    
    tvItem.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1));

    return TreeView_SetItem(hwndTreeView, &tvItem);
}


Помню, что мне не удавалось заставить систему саму переключить состояния чекбоксов, и я не долго думая реализовал переключение самостоятельно...

Автор: Qwe2 17.8.2012, 08:51
Пробую добавить иконки в свой image-list, но выводится черные квадраты вместо галок, где я не прав?
Код

BOOL DlgOnIntitDialog(HWND hWnd, HWND, LPARAM)
{
HWND hwndTree = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, "", 
WS_VISIBLE | WS_CHILD | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_NOHSCROLL /*| TVS_CHECKBOXES*/, 
28, 28, 564, 575, hWnd, (HMENU)ID_TVIEW, hInstance, NULL);

HIMAGELIST himl = ImageList_Create(16, 16, ILC_COLOR32, 0, 3);
HDC dc = GetDC(hWnd);
HDC mem = CreateCompatibleDC(dc);
HBITMAP hBitmap = CreateCompatibleBitmap(dc, 16, 16); 
SelectObject(mem, hBitmap);
RECT pRect = {0, 0, 16, 16};
DrawFrameControl(mem, &pRect, DFC_BUTTON, DFCS_BUTTON3STATE);
ImageList_Add(himl, hBitmap, NULL);
TreeView_SetImageList(hwndTree, himl, TVSIL_NORMAL );
DeleteObject(hBitmap);
DeleteDC(mem);

<...>

Автор: GremlinProg 17.8.2012, 10:11
Цитата(Qwe2 @  17.8.2012,  10:51 Найти цитируемый пост)
где я не прав?

1. GetDC( NULL );
2. фон?
3. ReleaseDC( NULL, dc );
4. проверка результирующих значений после вызовов функций
5. поэкспериментировать с флагами DrawFrameControl

Автор: Qwe2 19.8.2012, 11:34
Можно сказать получилось, только все выглядит не так, как хотелось бы:
(так у меня)
http://s2.ipicture.ru/
(так нужно + 3 состояние в тех же тонах)
http://s2.ipicture.ru/

Автор: GremlinProg 19.8.2012, 17:15
ну, это уже DrawThemeBackground, там тоже масса флагов, в том числе и 3-стейт чекбокса

Автор: Qwe2 21.8.2012, 16:59
Отчасти получилось, и просто в WM_PAINT'е отрисовать, и в image-list добавить, но! в Windows XP все равно черные квадраты вместо иконок (в image-liste)... Это с чем может быт связано?

http://s1.ipicture.ru/

Автор: GremlinProg 22.8.2012, 07:03
Цитата(Qwe2 @  21.8.2012,  18:59 Найти цитируемый пост)
Windows XP все равно черные квадраты вместо иконок (в image-liste)... Это с чем может быт связано?

может манифест?
Код

#ifndef _WIN64
    #pragma comment( linker, "\"/manifestdependency:type='Win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='X86' \
    publicKeyToken='6595b64144ccf1df' language='*'\"" )
#else
    #pragma comment( linker, "\"/manifestdependency:type='Win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' \
    publicKeyToken='6595b64144ccf1df' language='*'\"" )
#endif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)