Как убрать прямоугольник фокуса с элемента BUTTON
Как убрать прямоугольник фокуса с элемента BUTTON
При получении фокуса элементами диалогового окна типа BUTTON, они выделяются прямоугольной пунктирной рамкой. К таким элементам относятся простые кнопки, чекбоксы или радиопереключатели. Это хорошо и правильно, так как является стандартным поведением системы. Но сегодня я расскажу, как избавиться от этой рамки при фокусировке. Зачем это нужно? Ну, например, если вы используете собственную стилизацию элементов управления диалогового окна и не хотите, чтобы система влияла на их отображение. Или же вам просто не нравятся пунктирные прямоугольники на элементах. Лично я как раз отношусь к этой категории :)
Начнем с теории. При изменении внешнего вида элемента диалогового окна, то есть при отрисовке вокруг него пунктирной рамки или ее скрытии, система отправляет элементу сообщение WM_UPDATEUISTATE с указанием соответствующего статуса активности. Субклассировав нужную кнопку, мы можем подменять значение статуса на тот, при котором рамка не отображается.
Немного констант, про которые не знает FASM. Вообще странно, ведь это сообщение и его параметры известны аж со времен Windows 2000, а инклуды FASM остановились в развитии как раз на этом уровне.
Code (Assembler) : Убрать нумерацию
- WM_UPDATEUISTATE = 0x0128
- UISF_HIDEFOCUS = 1
- UIS_SET = 1
Code (Assembler) : Убрать нумерацию
- .wminitdialog:
- ; Изменить состояние интерфейса кнопки
- invoke SendDlgItemMessage,[hwnddlg],ID_BTN,WM_UPDATEUISTATE,\
- (UIS_SET shl 16 + UISF_HIDEFOCUS),0
- ; Субклассировать кнопку
- invoke GetDlgItem,[hwnddlg],ID_BTN
- mov ebx,eax
- ; Установить наш собственный обработчик
- invoke SetWindowLong,ebx,GWL_WNDPROC,ButtonProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,ebx,GWL_USERDATA,eax
Code (Assembler) : Убрать нумерацию
- ;--------------------------------------------
- ; Субклассированный обработчик кнопки
- ;--------------------------------------------
- proc ButtonProc hBtn:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
- ; Система хочет поменять состояние интерфейса
- cmp [uMsg],WM_UPDATEUISTATE
- je .no_focus
- .process_ok:
- ; Получить адрес предыдущего обработчика
- invoke GetWindowLong,[hBtn],GWL_USERDATA
- ; Передать управление предыдущему обработчику
- invoke CallWindowProc,eax,[hBtn],[uMsg],[wParam],[lParam]
- ret
- .no_focus:
- ; Принудительно сбросить фокус
- mov [wParam],(UIS_SET shl 16 + UISF_HIDEFOCUS)
- jmp .process_ok
- .exit_proc:
- xor eax,eax
- ret
- endp
В приложении пример программы с исходным текстом, которая подавляет прямоугольник фокуса на кнопке и чекбоксе в своем окне.
Просмотров: 1211 | Комментариев: 4
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(13.10.2020 в 17:25):
Так исходник надо было собрать, все бы появилось. Обновил архив.
coldun
(13.10.2020 в 17:21):
>>В приложении пример программы с исходным текстом, которая подавляет прямоугольник фокуса на кнопке и чекбоксе в своем окне.
Кнопку- вижу, чекбокса- не вижу...
Кнопку- вижу, чекбокса- не вижу...
ManHunter
(06.09.2020 в 09:01):
Затем, что читать надо не только название статьи, а еще хотя бы первый абзац текста.
зачем
(06.09.2020 в 03:35):
ну это же когда с клавиатуры управляешь
если мышь поломана или тачпад на лэптопе не работает или вообще мыши нет
или просто влом мышой елозить
как тогда понять на каком элементе фокус
вслепую что-ли гадать
и вроде это вообще в настройках можно отключить то-ли мыши то-ли эксплорера без всякого асма
если мышь поломана или тачпад на лэптопе не работает или вообще мыши нет
или просто влом мышой елозить
как тогда понять на каком элементе фокус
вслепую что-ли гадать
и вроде это вообще в настройках можно отключить то-ли мыши то-ли эксплорера без всякого асма
Добавить комментарий
Заполните форму для добавления комментария