Blog. Just Blog

Работа с кнопкой Help в заголовке окна

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.

Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
  1. struct HELPINFO
  2.         cbSize       dd ?
  3.         iContextType dd ?
  4.         iCtrlId      dd ?
  5.         hItemHandle  dd ?
  6.         dwContextId  dd ?
  7.         MousePos     POINT
  8. ends
Суть контекстной справки заключается в том, чтобы при выборе пользователем какого-либо элемента диалогового окна, ему была предоставлена информация именно по этому элементу. Для персонализации справки можно назначить конкретному элементу окна контекстный идентификатор справки при помощи функции SetWindowContextHelpId. Это один из вариантов, с помощью которого в дальнейшем можно будет персонализировать справку.
  1. .wminitdialog:
  2.         ; Назначить контекстный идентификатор справки элементу окна
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON_1
  4.         invoke  SetWindowContextHelpId,eax,777
При нажатии кнопки справки в заголовке окна и выборе какого-нибудь элемента диалогового окна, родительскому окну отправляется сообщение WM_HELP, которое мы должны обработать.

Когда окну приходит сообщение WM_HELP, в параметре lParam передается указатель на структуру HELPINFO, в которой содержится исчерпывающая информация об элементе и координатах окна, по которым пользователь запросил справку.
  1.         cmp     [msg],WM_HELP
  2.         je      .wmhelp
  3.         ...
  4. .wmhelp:
  5.         ; Указатель на структуру HELPINFO
  6.         mov     esi,[lparam]
  7.  
  8.         ; Проверить контекстный идентификатор справки
  9.         cmp     dword [esi+HELPINFO.dwContextId],777
  10.         je      .info_1
  11.  
  12.         ; Проверить хэндл элемента окна
  13.         invoke  GetDlgItem,[hwnddlg],ID_EDIT_FIELD_01
  14.         cmp     dword [esi+HELPINFO.hItemHandle],eax
  15.         je      .info_2
  16.  
  17.         ; Проверить ID элемента окна
  18.         cmp     dword [esi+HELPINFO.iCtrlId],ID_EDIT_FIELD_02
  19.         je      .info_3
  20.  
  21.         ; Проверить по координатам элемента окна
  22.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON_2
  23.         invoke  GetWindowRect,eax,pos
  24.         invoke  PtInRect,pos,[esi+HELPINFO.MousePos.x],[esi+HELPINFO.MousePos.y]
  25.         or      eax,eax
  26.         jnz     .info_4
  27.         ...
В поле iCtrlId передается ID элемента, в поле hItemHandle - хэндл элемента, в dwContextId - контекстный идентификатор справки, назначенный ранее функцией SetWindowContextHelpId, а во вложенной структуре MousePos - координаты в окне, на которых была запрошена справка. Определив координаты клика, можно определить их вхождение в границы нужного элемента или область окна с помощью функции PtInRect. В зависимости от решаемой задачи, вы можете применить тот или иной способ для определения, какой раздел справки хотел бы увидеть пользователь.

Теперь, зная, к какому элементу диалогового окна пользователь запросил подсказку, можно открыть файл справки на требуемом разделе, вывести окно сообщения с подсказкой или еще как-нибудь помочь пользователю с запрошенной информацией.

В приложении пример программы с исходным текстом, которая использует контекстную справку для элементов диалогового окна.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Help.Button.Demo.zip (2,664 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1034 | Комментариев: 4

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
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

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0061 сек.) / Память: 4.5 Mb
Наверх