Окно поверх всех окон (Always On Top)

Установка окна поверх всех других окон бывает удобна, когда надо привлечь внимание пользователя к важной информации, или окно с какими-либо данными должно находиться всегда перед глазами. Такое свойство окна можно прописать сразу в ресурсах, а можно изменять динамически, например при нажатии на кнопку-чекбокс "Always on top" или при изменении каких-нибудь внутренних настроек вашей программы.

Для создания окна поверх всех других окон, оно должно быть описано в ресурсах с флагом DS_SYSMODAL. Для динамического изменения используется функция SetWindowPos с флагами SWP_NOMOVE и SWP_NOSIZE. Флаги нужны для того, чтобы не изменять размеры и положение окна.
; Идентификатор чекбокса в ресурсах
ID_ONTOP        = 101
 
; Сегмент кода
section '.code' code readable executable
        ...
; Процедура обработчика окна
proc DialogProc hwnddlg,msg,wparam,lparam
        ; Обработка нажатия на кнопку-чекбокс
        cmp     [wparam],BN_CLICKED shl 16 + ID_ONTOP
        je      .ontop
        ...
.ontop:
        ; Получить состояние чекбокса
        invoke  IsDlgButtonChecked,[hwnddlg],ID_ONTOP
        cmp     eax,BST_CHECKED
        ; По умолчанию будем считать что галочка поставлена
        mov     eax,HWND_TOPMOST
        je      @f
        ; Галочка не поставлена, убрать атрибут "поверх всех окон"
        mov     eax,HWND_NOTOPMOST
@@:
        ; Установить параметр окна "поверх всех окон", изменение размера
        ; и положения окна не производится, это установлено флагами
        invoke  SetWindowPos,[hwnddlg],eax,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE
        jmp     .processed
        ...
 
; Секция ресурсов
section '.rsrc' resource data readable
; Диалог описан со стилем DS_SYSMODAL - поверх всех окон
dialog demonstration, 'Always on top Demo', 0, 0, 190, 55,\
        WS_CAPTION+WS_SYSMENU+DS_CENTER+DS_SYSMODAL
        ...
        ; Кнопка-чекбокс, которая будет управлять положением окна
        dialogitem 'BUTTON','Always on top', ID_ONTOP, 5, 150, 63, 13,\
        WS_VISIBLE+BS_AUTOCHECKBOX+BS_FLAT
        ...

В приведенном примере при поставленной галочке "Always on top" окно будет находиться поверх других окон. Исходник с откомпилированным файлом прилагается.
Теги:
Always On To
Добавлено: 10 Апреля 2018 20:44:09 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...