Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199

Header control - собственная отрисовка

13.04.2022, 00:49. Показов 1211. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю собственную отрисовку header control'а, который находится в ListView.

В оконной процедуре ListView обрабатываю WM_NOTIFY -> NM_CUSTOMDRAW -> CDDS_PREPAINT -> CDDS_ITEMPREPAINT.

Здесь, согласно данным структуры LPNMCUSTOMDRAW, выполняю отрисовку.

В структуре NMCUSTOMDRAW есть параметр uItemState, который как раз указывает на то, каким образом рисовать item: в нормальном состоянии или мышь наведена или мышь зажата.
Но это так должно быть. На самом же деле (на практике) параметр uItemState имеет только 2 значения: 0 и CDIS_SELECTED (когда нажали левой кнопкой мыши на item).

Т.е. получается такая ситуация, что когда мы наводим курсор на item header control'a, приходит сообщение WM_NOTIFY с кодом NM_CUSTOMDRAW, т.е. header control нас уведомляет о том, что нужно сделать перерисовку. Но он никак не даёт понять, какое состояние при этом имеет item, как его рисовать. Значение поля uItemState = 0, а должно быть CDIS_HOT.

И вот здесь вопрос - как же при получении NM_CUSTOMDRAW понять, какое состояние имеет item? Как понять, что мышь наведена?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.04.2022, 00:49
Ответы с готовыми решениями:

Собственная отрисовка TreeView - не видно узлов
Добрый день,форумчане. Такая проблема: на форме имеется Treeview с 4-ия уровнями вложенности узлов. Отрисовываю я его сама. Проблема в...

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is pr
$scope.testsearcher = function(event){ var httpConfig = {method: 'GET', url:...

No 'Access-Control-Allow-Origin' header is present
Здравствуйте. Пытаюсь сделать тестовое задание: . Fetch запрос на указанный адрес http://static.feed.rbc.ru/rbc/logical/footer/news.rss...

2
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
13.04.2022, 07:00
Igor-84, я не вникал сейчас в детали, но всегда можно определить, где расположен курсор. Пригодятся функции
GetCursorPos
WindowFromPoint
MapWindowPoints
0
 Аватар для Igor-84
28 / 27 / 11
Регистрация: 04.03.2010
Сообщений: 199
13.04.2022, 15:51  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Пригодятся функции
Да, это понятно, но я надеялся, что есть стандартные механизмы самого header control'а, благодаря которым можно узнать реальное состояние item'а в момент перерисовки.
Если же вести речь о использовании GetCursorPos, то эмпирическим путём я выяснил такую закономерность в координатах:

Серым обозначены области, соответствующие позиции курсора относительно item'а.
Отсюда написал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POINT cur_pos;
GetCursorPos(&cur_pos);
ScreenToClient(header_hwnd, &cur_pos);
 
   if(nmcd->uItemState & CDIS_SELECTED)
   item_state = state_pressed;
   else
   {
   if((nmcd->dwItemSpec == 0 && ((cur_pos.x >= nmcd->rc.left && cur_pos.x < (nmcd->rc.right + 8)) &&//для первого item'a
   (cur_pos.y >= nmcd->rc.top && cur_pos.y < nmcd->rc.bottom))) ||
   ((cur_pos.x > (nmcd->rc.left + 7) && cur_pos.x < (nmcd->rc.right + 8)) &&//для всех остальных
   (cur_pos.y >= nmcd->rc.top && cur_pos.y < nmcd->rc.bottom)))
   item_state = state_hot;
   else
   item_state = state_normal;
   }
В целом, это работает. Но если создать такую ситуацию, когда имеется 2 колонки - первая шириной 100, а вторая - 30, то вышеописанные условия не работают, т.к. в таком случае величина "нахлёста" уже другая.
В общем, использование GetCursorPos - это костыль ещё тот, а использование приведёного кода неэффективно для колонок малой ширины (30-50).
И главное - почему поле nmcd->uItemState в момент наведения курсора содержит значение 0, а не CDIS_HOT? Очередной баг Windows или что-то нужно дополнительно указать/задать окну header control'a?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.04.2022, 15:51
Помогаю со студенческими работами здесь

No 'Access-Control-Allow-Origin' header is present on the requested resource
Здравствуйте. Есть задача забрать html-код со страниц сторонних сайтов и производить некоторые действия. Для этого сделали приложение для...

No 'Access-Control-Allow-Origin' header is present on the requested resource
При выполнении запроса: $.post('http://localhost:9909', JSON.stringify(requestData)).success(function(data){console.log(data)}) ...

Ограничить или запретить изменение ширины элемента в Header Control
Можно ли ограничить изменение ширины или вовсе запретить изменять ширину конкретного элемента в Header control. Под ограничением...

Ошибка No 'Access-Control-Allow-Origin' header is present on the requested resource
Добрый день. Вот такое AJAX запрос. $.ajax({ type: &quot;GET&quot;, url:...

Xmlhttprequest No Access-Control-Allow-Origin been blocked by CORS policy header
Всем привет, браузер не отображает иконки и пишет ошибки заголовков. Произошло это после переезда на httpS, подскажите как решить эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru