Blog. Just Blog

Как убрать прямоугольник фокуса с элемента BUTTON

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Как убрать прямоугольник фокуса с элемента BUTTON
Как убрать прямоугольник фокуса с элемента BUTTON

При получении фокуса элементами диалогового окна типа BUTTON, они выделяются прямоугольной пунктирной рамкой. К таким элементам относятся простые кнопки, чекбоксы или радиопереключатели. Это хорошо и правильно, так как является стандартным поведением системы. Но сегодня я расскажу, как избавиться от этой рамки при фокусировке. Зачем это нужно? Ну, например, если вы используете собственную стилизацию элементов управления диалогового окна и не хотите, чтобы система влияла на их отображение. Или же вам просто не нравятся пунктирные прямоугольники на элементах. Лично я как раз отношусь к этой категории :)

Начнем с теории. При изменении внешнего вида элемента диалогового окна, то есть при отрисовке вокруг него пунктирной рамки или ее скрытии, система отправляет элементу сообщение WM_UPDATEUISTATE с указанием соответствующего статуса активности. Субклассировав нужную кнопку, мы можем подменять значение статуса на тот, при котором рамка не отображается.

Немного констант, про которые не знает FASM. Вообще странно, ведь это сообщение и его параметры известны аж со времен Windows 2000, а инклуды FASM остановились в развитии как раз на этом уровне.
  1. WM_UPDATEUISTATE = 0x0128
  2. UISF_HIDEFOCUS   = 1
  3. UIS_SET          = 1
С субклассированием проблем возникнуть не должно, эта тема поднималась тут не один раз. Лучше всего это делать на этапе инициализации окна. Но перед субклассированием обязательно надо сбросить пунктирную рамку, отправив кнопке сообщение WM_UPDATEUISTATE с параметром UISF_HIDEFOCUS. В дальнейшем этим будет заниматься субклассированный обработчик.
  1. .wminitdialog:
  2.         ; Изменить состояние интерфейса кнопки
  3.         invoke  SendDlgItemMessage,[hwnddlg],ID_BTN,WM_UPDATEUISTATE,\
  4.                 (UIS_SET shl 16 + UISF_HIDEFOCUS),0
  5.  
  6.         ; Субклассировать кнопку
  7.         invoke  GetDlgItem,[hwnddlg],ID_BTN
  8.         mov     ebx,eax
  9.         ; Установить наш собственный обработчик
  10.         invoke  SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
  11.         ; Сохранить хэндл предыдущего обработчика
  12.         invoke  SetWindowLong,ebx,GWL_USERDATA,eax
Обработчик простейший, при поступлении сообщения WM_UPDATEUISTATE значение параметра wParam принудительно подменяется на установку подавления фокуса, в результате чего прямоугольник фокуса никогда не появится.
  1. ;--------------------------------------------
  2. ; Субклассированный обработчик кнопки
  3. ;--------------------------------------------
  4. proc ButtonProc hBtn:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  5.         ; Система хочет поменять состояние интерфейса
  6.         cmp     [uMsg],WM_UPDATEUISTATE
  7.         je      .no_focus
  8.  
  9. .process_ok:
  10.         ; Получить адрес предыдущего обработчика
  11.         invoke  GetWindowLong,[hBtn],GWL_USERDATA
  12.         ; Передать управление предыдущему обработчику
  13.         invoke  CallWindowProc,eax,[hBtn],[uMsg],[wParam],[lParam]
  14.         ret
  15.  
  16. .no_focus:
  17.         ; Принудительно сбросить фокус
  18.         mov     [wParam],(UIS_SET shl 16 + UISF_HIDEFOCUS)
  19.         jmp     .process_ok
  20.  
  21. .exit_proc:
  22.         xor     eax,eax
  23.         ret
  24. endp
При этом элемент остается кликабельным, он точно так же реагирует на активацию кнопкой пробела, фокус переходит при нажатии табуляции и т.п., подавляется только сама отрисовка пунктирной рамки. Один и тот же обработчик может быть задействован для нескольких элементов диалогового окна, естественно, при условии, что больше никакого колдунства они делать не должны.

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

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

No.Focus.Rectangle.Demo.zip (2,464 bytes)


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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (13.10.2020 в 17:25):
Так исходник надо было собрать, все бы появилось. Обновил архив.
coldun (13.10.2020 в 17:21):
>>В приложении пример программы с исходным текстом, которая подавляет прямоугольник фокуса на кнопке и чекбоксе в своем окне.
Кнопку- вижу, чекбокса- не вижу...
ManHunter (06.09.2020 в 09:01):
Затем, что читать надо не только название статьи, а еще хотя бы первый абзац текста.
зачем (06.09.2020 в 03:35):
ну это же когда с клавиатуры управляешь
если мышь поломана или тачпад на лэптопе не работает или вообще мыши нет
или просто влом мышой елозить
как тогда понять на каком элементе фокус
вслепую что-ли гадать

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

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

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

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