Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView и checkbox с 3 состояниями 
:(
    Опции темы
Qwe2
Дата 16.8.2012, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Нужно сделать TreeView с checkbox'ами с тремя состояниями. Вроде бы в этом случае вмсето чекбоксов по умолчанию нужно использовать иконки: то есть заполнить image-list 3 иконками галок. Где-то видел, что эти иконки можно извлечь из системы (из обычного чекбокса) и ими заполнить image-list. Чтобы не файлы ico|bmp использовать. Как это можно сделать?
PM MAIL   Вверх
GremlinProg
Дата 16.8.2012, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



можно нарисовать:
Код

DrawFrameControl( hdc, pRect, DFC_BUTTON, DFCS_BUTTON3STATE );

или с DFCS_BUTTONCHECK vs DFCS_HOT, DFCS_PUSHED, DFCS_CHECKED


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 16.8.2012, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



А как добавить в image-list?
PM MAIL   Вверх
GremlinProg
Дата 16.8.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 17.8.2012, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Честно говоря, тему подзабыл. То, что помню:
  • установить стиль 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);
}


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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Qwe2
Дата 17.8.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Пробую добавить иконки в свой 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);

<...>


Это сообщение отредактировал(а) Qwe2 - 17.8.2012, 08:52
PM MAIL   Вверх
GremlinProg
Дата 17.8.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.8.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Можно сказать получилось, только все выглядит не так, как хотелось бы:
(так у меня)
user posted image
(так нужно + 3 состояние в тех же тонах)
user posted image
PM MAIL   Вверх
GremlinProg
Дата 19.8.2012, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ну, это уже DrawThemeBackground, там тоже масса флагов, в том числе и 3-стейт чекбокса


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 21.8.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



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

user posted image
PM MAIL   Вверх
GremlinProg
Дата 22.8.2012, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(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


Это сообщение отредактировал(а) GremlinProg - 22.8.2012, 07:07


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.