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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView - как изменить вид selected item? как изменить дефолтную прорисовку 
:(
    Опции темы
Aleksandor
Дата 17.10.2006, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



Имеется List View (icon view) - выбранный элемент в нем рисуется под синей полупрозрачной маской, имя файла показывается полностью. Если имя длинное то занимает две строчки.
Мне нужно чтобы имя всегда было на ОДНОЙ строке , как в невыбранных элементах, а изображение закрашено СПЛОШНЫМ синим фоном, но только по краям. 
Можно ли это дело как-то поправить? Куда надо копать чтобы перехватить прорисовку Selected Item?


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
GremlinProg
Дата 17.10.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WM_DRAWITEM, но в любом случае, чтобы имя не занимало несколько строк нужно использовать стили LVS_OWNERDATA, или LVS_OWNERDRAWFIXED, чтобы сздать виртуальный лист-вью.


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


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



Спасибо за совет smile  Я использую LVS_OWNERDATA. Попробую добавить LVS_OWNERDRAWFIXED

Между прочим в описании WM_DRAWITEM нашел такое:
"Before returning from processing this message, an application should ensure that the device context identified by the hDC member of the DRAWITEMSTRUCT structure is in the default state. "

Значит ли это что нужно вызывать SaveDC/RestoreDC или как иначе быть уверенным что device context ... in the default state? 





--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
GremlinProg
Дата 17.10.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Aleksandor @  17.10.2006,  16:31 Найти цитируемый пост)
Before returning from processing this message, an application should ensure that the device context identified by the hDC member of the DRAWITEMSTRUCT structure is in the default state.

Если хорошенько подумать, то тут упор делается на сам контекст, а не на его состояние, т.е. для него не должны вывзываться ни DeleteDC, ни ReleaseDC. SaveDC/RestoreDC можно, но не обязательно, если изменения не касаются объектов выбранных в контекст. Проще и быстрее будет использовать возвращаемые значения GDI функций, например так:
Код

HGDIOBJ svFont = SelectObject(hdc,hMyFont);
COLORREF svClr = SetBkColor(hdc,RGB(10,10,10));
...
SetBkColor(hdc,svClr);
SelectObject(hdc,svFont);

Так, мы восстанавливаем только то, что изменяем, а не весь девайс.


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


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



LVS_OWNERDRAWFIXED только для Report view  smile 
 Делаю так (в ответ на LVN_GETDISPINFO)

if (pLvdi->item.mask & LVIF_IMAGE)   { 

hBrushBk=GetSysColorBrush(COLOR_ACTIVEBORDER);
if (LVIS_SELECTED == ListView_GetItemState (hwndList, pLvdi->item.iItem, LVIS_SELECTED))  hBrushBk=GetSysColorBrush(COLOR_HIGHLIGHT);
......
рисуем битмап
......
ImageList_Add(hTmbImgList, hBmp, NULL);
pLvdi->item.iImage= 0; // единственный
}


Все равно рисуется сверху синяя маска и длинные имена файлов на двух строчках smile 



--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
GremlinProg
Дата 17.10.2006, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



либо в LVN_GETDISPINFO обрезай строки, либо пробуй перехватывать LVM_SETWORKAREAS и корректируй высоту итемов.


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


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

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



Цитата(GremlinProg @ 17.10.2006,  18:40)
либо в LVN_GETDISPINFO обрезай строки, либо пробуй перехватывать LVM_SETWORKAREAS и корректируй высоту итемов.


стиль LVS_NOLABELWRAP помог, но похоже обрезать имена файлов придется самому. Мне нужно чтобы ширина лейбла равнялась ширине иконки.

Чтоб избавиться от оверлея пришлось субклассировать и писать свой обработчик для WM_LBUTTONDOWN. Иначе ставится LVIS_FOCUSED и рисуется оверлей с рамкой  smile

Очень хочу почитать код нативного обработчика, скажем WM_LBUTTONDOWN для лист вью  smile Вопрос как. Хочется на С конешно, но можно и на ассемблере.  

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


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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