
Окно поверх всех окон (Always On Top)
Установка окна поверх всех других окон бывает удобна, когда надо привлечь внимание пользователя к важной информации, или окно с какими-либо данными должно находиться всегда перед глазами. Такое свойство окна можно прописать сразу в ресурсах, а можно изменять динамически, например при нажатии на кнопку-чекбокс "Always on top" или при изменении каких-нибудь внутренних настроек вашей программы.Для создания окна поверх всех других окон, оно должно быть описано в ресурсах с флагом DS_SYSMODAL. Для динамического изменения используется функция SetWindowPos с флагами SWP_NOMOVE и SWP_NOSIZE. Флаги нужны для того, чтобы не изменять размеры и положение окна.
Code (Assembler) : Убрать нумерацию
- ; Идентификатор чекбокса в ресурсах
- 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
- ...
Просмотров: 11914 | Комментариев: 3

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

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

Тема конечно нафталиновая, но уже все поисковики затеребонькал. До 2009 года дошёл. Подскажи если в курсе. Создаю диалоговое окно функцией CreateWindowEx, с размерами всё в порядке.
Как только создаю через DialogBoxParam, (с секцией ресурсов) то начинает какая то хрень с размерами твариться.При ширине экрана 1600, окно в 1200 едениц указанные в секции rsrc уже в монитор не лезет. Хотя когда всё тоже самое делаю через CreateWindowEx нормально влезает. Что я не так делаю?