Работа с кнопкой Help в заголовке окна
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
Code (Assembler) : Убрать нумерацию
- struct HELPINFO
- cbSize dd ?
- iContextType dd ?
- iCtrlId dd ?
- hItemHandle dd ?
- dwContextId dd ?
- MousePos POINT
- ends
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Назначить контекстный идентификатор справки элементу окна
- invoke GetDlgItem,[hwnddlg],ID_BUTTON_1
- invoke SetWindowContextHelpId,eax,777
Когда окну приходит сообщение WM_HELP, в параметре lParam передается указатель на структуру HELPINFO, в которой содержится исчерпывающая информация об элементе и координатах окна, по которым пользователь запросил справку.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_HELP
- je .wmhelp
- ...
- .wmhelp:
- ; Указатель на структуру HELPINFO
- mov esi,[lparam]
- ; Проверить контекстный идентификатор справки
- cmp dword [esi+HELPINFO.dwContextId],777
- je .info_1
- ; Проверить хэндл элемента окна
- invoke GetDlgItem,[hwnddlg],ID_EDIT_FIELD_01
- cmp dword [esi+HELPINFO.hItemHandle],eax
- je .info_2
- ; Проверить ID элемента окна
- cmp dword [esi+HELPINFO.iCtrlId],ID_EDIT_FIELD_02
- je .info_3
- ; Проверить по координатам элемента окна
- invoke GetDlgItem,[hwnddlg],ID_BUTTON_2
- invoke GetWindowRect,eax,pos
- invoke PtInRect,pos,[esi+HELPINFO.MousePos.x],[esi+HELPINFO.MousePos.y]
- or eax,eax
- jnz .info_4
- ...
Теперь, зная, к какому элементу диалогового окна пользователь запросил подсказку, можно открыть файл справки на требуемом разделе, вывести окно сообщения с подсказкой или еще как-нибудь помочь пользователю с запрошенной информацией.
В приложении пример программы с исходным текстом, которая использует контекстную справку для элементов диалогового окна.
Просмотров: 1137 | Комментариев: 4
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Petya
(16.09.2021 в 17:05):
Нашёлся-таки образец. WinXP, настройки меню "Пуск" и панели задач.
Petya
(02.08.2021 в 13:21):
Это tooltip из другой. Он выглядит немного иначе и появляется при наведении, а не при клике в активированным help. Найду какую-нибудь программу, где сделано именно так - назову.
ManHunter
(02.08.2021 в 12:35):
Это немного из другой сказки https://www.manhunter.ru/assem...h_oknah.html
Petya
(02.08.2021 в 12:33):
ЕМНИП, пока эта кнопка активно применялась, считалось хорошим тоном делать контекстную справку примерно так:
https://www.upload.ee/files/13...elp.png.html
Добавить комментарий
Заполните форму для добавления комментария