
Получение информации о заголовке окна
Манипулировать кнопками в заголовке окна мы уже научились. А как узнать, какие кнопки отображаются в заголовке окна и в каком они состоянии? Конечно, можно пройтись по стилям, по меню, но правильнее будет воспользоваться следующей информацией. Мне кажется, она станет хорошим дополнением к статье об управлении кнопками в заголовке окна.Для получения подробной информации о заголовке окна ему отправляется сообщение WM_GETTITLEBARINFOEX. Если все прошло успешно, на выходе получается заполненная структура TITLEBARINFOEX, в которой содержится информация о позициях и состоянии кнопок в заголовке окна, а также о размере самого заголовка.
Сперва надо описать структуру TITLEBARINFOEX и несколько констант, так как FASM в базовой комплектации о них не знает. Скорее всего это потому, что сообщение WM_GETTITLEBARINFOEX поддерживается только в Windows Vista и выше.
Code (Assembler) : Убрать нумерацию
- struct TITLEBARINFOEX
- cbSize dd ?
- rcTitleBar RECT
- stateTitleBar dd ?
- sReserved1 dd ?
- stateMinimize dd ?
- stateMaximize dd ?
- stateHelp dd ?
- stateClose dd ?
- rReserved0 RECT
- rReserved1 RECT
- rectMinimize RECT
- rectMaximize RECT
- rectHelp RECT
- rectClose RECT
- ends
- WM_GETTITLEBARINFOEX = 0x033F
- STATE_SYSTEM_FOCUSABLE = 0x00100000
- STATE_SYSTEM_INVISIBLE = 0x00008000
- STATE_SYSTEM_OFFSCREEN = 0x00010000
- STATE_SYSTEM_UNAVAILABLE = 0x00000001
- STATE_SYSTEM_PRESSED = 0x00000008
Теперь переходим к коду. Тут ничего сложного, заполнили размер структуры, отправили сообщение окну, работаем с нужными полями структуры. В этом примере проверяется наличие и состояние кнопки Close в заголовке окна, если она есть и активна, то курсор устанавливается на ее центр.
Code (Assembler) : Убрать нумерацию
- ; Получить информацию о заголовке окна
- mov [tbinfo.cbSize],sizeof.TITLEBARINFOEX
- invoke SendMessage,[hwnddlg],WM_GETTITLEBARINFOEX,0,tbinfo
- ; Кнопка Close отображается?
- test [tbinfo.stateClose],STATE_SYSTEM_INVISIBLE\
- or STATE_SYSTEM_OFFSCREEN or STATE_SYSTEM_UNAVAILABLE
- jnz .processed
- ; Координаты центра кнопки
- mov eax,[tbinfo.rectClose.bottom]
- sub eax,[tbinfo.rectClose.top]
- shr eax,1
- add eax,[tbinfo.rectClose.top]
- push eax
- mov eax,[tbinfo.rectClose.right]
- sub eax,[tbinfo.rectClose.left]
- shr eax,1
- add eax,[tbinfo.rectClose.left]
- push eax
- ; Установить курсор на центр кнопки
- invoke SetCursorPos
В приложении пример программы с исходным текстом, которая реализует пример из статьи.
Просмотров: 1539 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий
Заполните форму для добавления комментария
