Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

MessageBox с чекбоксом "Больше не показывать"

04.10.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще одна хорошая практика взаимодействия с пользователем - окно сообщения с чекбоксом "Больше не показывать это диалоговое окно". Таким образом и приложение выполняет свою работу по уведомлению пользователя о каком-то периодическом событии, и пользователь сам решает, желает ли он наблюдать это уведомление в дальнейшем. Делается это при помощи стандартной функции SHMessageBoxCheck. По параметрам эта функция очень похожа на вызов MessageBox, но поддерживает ограниченное количество стилей и не весь набор кнопок, а также обязательно требует текстовую строку с уникальным идентификатором этого сообщения. В остальном все сводится к единственному вызову, типа такого:
  1. ; Уникальный идентификатор окна сообщения
  2. szUID   db '{D9108BA3-9A61-4398-BFBC-B02102C77E8A}',0
  3.         ...
  4.         ; Значение по умолчанию
  5.         DEFAULT_RESULT = 0
  6.         ; Вывести окно сообщения с галочкой "Больше не показывать"
  7.         invoke  SHMessageBoxCheck,HWND_DESKTOP,\
  8.                 szMess,szTitle,MB_YESNO+MB_ICONEXCLAMATION,\
  9.                 DEFAULT_RESULT,szUID
  10.         ; EAX = выбранная кнопка или DEFAULT_RESULT
Получившееся окно очень похоже на обычное окно сообщения, только внизу к нему добавляется локализованная строка "Больше не показывать это диалоговое окно". Если пользователь поставит эту галочку и сделает какой-либо выбор, в реестре в ключе HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain добавится новый параметр с именем уникального идентификатора, который был использован при создании окна сообщения, и строковым значением "NO". При очередном вызове функции SHMessageBoxCheck с таким же уникальным идентификатором, система проверяет наличие и значение этого параметра. Если параметр в реестре найден, то окно сообщения появляться не будет, а приложению сразу же вернется используемое при вызове дефолтное значение. Кстати, хотя такое окно визуально напоминает окно, создаваемое функцией MessageBox и ее аналогами, по своей структуре оно гораздо сложнее. И если у вас вдруг возникнет желание как-нибудь его кастомизировать, то сделать это будет не так просто. По крайней мере на установку хука WH_CBT оно точно не реагирует.

Читать статью целиком »
Просмотров: 266 | Комментариев: 6

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

28.07.2021 | Категория: Образ мышления: 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, которое мы должны обработать.

Читать статью целиком »
Просмотров: 465 | Комментариев: 4

MessageBox с таймером обратного отсчета

31.01.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter

MessageBox с таймером обратного отсчета

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

Читать статью целиком »
Просмотров: 965 | Комментариев: 6

Подгонка размеров поля EDIT под используемый шрифт

07.12.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Много чего уже делали и с полями ввода, и со шрифтами. На очереди автоматическая подгонка высоты однострочного элемента EDIT в зависимости от размеров шрифта, который ему назначен. Это необходимо, чтобы при изменении шрифта текст в поле ввода смотрелся правильно. Высота EDIT считается по высоте выбранного шрифта плюс отступ толщиной в двойную рамку, чтобы текст при отображении эту рамку не перекрывал. В случае многострочных полей ввода высоту надо считать по высоте шрифта, умноженной на необходимое количество строк, плюс отступ.
  1. ;-------------------------------------------------------------
  2. ; Подгонка размера поля EDIT под заданный шрифт
  3. ;-------------------------------------------------------------
  4. ; Параметры:
  5. ;   hEdit - хэндл поля EDIT
  6. ;   hFont - хэндл шрифта
  7. ;-------------------------------------------------------------
  8. proc resize_edit hEdit:DWORD, hFont:DWORD
  9.         locals
  10.             rc RECT
  11.             tm TEXTMETRIC
  12.         endl
  13.  
  14.         pusha
  15.  
  16.         mov     edi,[hEdit]
  17.  
  18.         ; Получить контекст устройства
  19.         invoke  GetDC,edi
  20.         or      eax,eax
  21.         ; Поля ввода не существует, на выход
  22.         jz      .loc_exit
  23.  
  24.         xchg    eax,esi
  25.  
  26.         ; Выбрать шрифт
  27.         invoke  SelectObject,esi,[hFont]
  28.         or      eax,eax
  29.         jnz     @f
  30.  
  31.         ; Шрифт не загружен, на выход
  32.         invoke  ReleaseDC,edi,esi
  33.         jmp     .loc_exit
  34. @@:
  35.         ; Получить метрику выбранного шрифта
  36.         lea     ebx,[tm]
  37.         invoke  GetTextMetrics,esi,ebx
  38.         invoke  ReleaseDC,edi,esi
  39.  
  40.         ; Высота шрифта
  41.         mov     ebx,[ebx+TEXTMETRIC.tmHeight]
  42.         ; Добавить к высоте размер рамки
  43.         invoke  GetSystemMetrics,SM_CYEDGE
  44.         shl     eax,2
  45.         add     ebx,eax
  46.  
  47.         ; Получить размеры поля EDIT
  48.         lea     esi,[rc]
  49.         invoke  GetWindowRect,edi,esi
  50.         invoke  GetParent,edi
  51.         ; Отмасштабировать координаты окна
  52.         invoke  MapWindowPoints,HWND_DESKTOP,eax,esi,2
  53.  
  54.         ; Установить новые размеры поля EDIT
  55.         mov     eax,[esi+RECT.right]
  56.         sub     eax,[esi+RECT.left]
  57.         invoke  MoveWindow,edi,[esi+RECT.left],[esi+RECT.top],eax,ebx,TRUE
  58.  
  59. .loc_exit:
  60.         popa
  61.         ret
  62. endp
Функция самодостаточная, не требует дополнительных переменных в сегменте данных. На входе два параметра: hEdit - хэндл поля EDIT, у которого надо изменить размер, и hFont - хэндл шрифта, под размер которого в поле ввода вносятся изменения. Вызывать функцию изменения размера надо сразу после назначения шрифта полю EDIT.

Читать статью целиком »
Просмотров: 366 | Комментариев: 1

Работа с контролом SysTabControl32 на Ассемблере

31.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с контролом SysTabControl32 на Ассемблере

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

Читать статью целиком »
Просмотров: 645 | Комментариев: 6

prev 01 02 03 04 05 06 07 08 09 ... 13
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.12 сек. / MySQL: 3 (0.0484 сек.) / Память: 4.75 Mb
Наверх