![Blog. Just Blog](/images/logo.png)
Окна нестандартной формы на Ассемблере. Часть 1
Фигурная резьба по деревянным окнам - старинное народное творчество. А в нашем 21-м веке народным творчеством будет резьба по окнам Windows. При умелом использовании это станет стильным украшением для ваших приложений, добавив им привлекательности.Форма окна определяется особыми структурами, называемыми регионами. Они могут быть прямоугольной формы, закругленной, эллиптической и многоугольной. Весь принцип работы с регионами сводится к следующему. Сперва создается главный регион, равный по размерам основному диалоговому окну, затем создаются дополнительные регионы нужного размера и накладываются на него с нужной битовой маской. Режимы наложения определяют будет ли новый регион удален из основного, или же наоборот добавлен. Размер главного региона лучше всего рассчитывать из результатов функции GetClientRect, вызванной с хэндлом нужного диалогового окна. Наложение регионов выполняется функцией CombineRgn, возможные режимы наложения смотрите в официальной документации. Все действия выполняются на этапе инициализации окна по событию WM_INITDIALOG.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- hRMain dd ? ; Хэндл главного региона окна
- coord RECT ; Координаты окна для вычисления размера региона
- ...
Фрагмент обработчика WM_INITDIALOG, создающего окно нестандартной формы:
Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Получить размер окна
- invoke GetClientRect,[hwnddlg],coord
- ; Записать в стек размеры окна для создания главного региона
- mov eax,[coord.bottom]
- sub eax,[coord.top]
- push eax
- mov eax,[coord.right]
- sub eax,[coord.left]
- push eax
- ; Создать главный регион диалогового окна
- invoke CreateRectRgn,0,0
- mov [hRMain],eax
- ; Вырезать прямоугольный регион (режим RGN_DIFF)
- invoke CreateRectRgn,0,60,268,63
- push eax
- invoke CombineRgn,[hRMain],[hRMain],eax,RGN_DIFF
- ; Освободить хэндл и память региона
- invoke DeleteObject
- ; Добавить закругленный регион (режим RGN_OR)
- invoke CreateRoundRectRgn,14,117,110,132,15,15
- push eax
- invoke CombineRgn,[hRMain],[hRMain],eax,RGN_OR
- ; Освободить хэндл и память региона
- invoke DeleteObject
- ...
- ; И так далее по очереди на главный регион накладываются
- ; регионы нужного размера и формы
- ...
- ; Установить новый регион для окна и перерисовать его
- invoke SetWindowRgn,[hwnddlg],[hRMain],TRUE
- ; Освободить хэндл и память главного региона
- invoke DeleteObject,[hRMain]
- ...
В приложении пример диалогового окна с несколькими вырезанными прямоугольными регионами и одним добавленным закругленным регионом.
Просмотров: 7170 | Комментариев: 1
![](/images/dot.gif)
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Rambler
(06.10.2009 в 05:27):
THX!
![](/images/dot.gif)
Добавить комментарий
Заполните форму для добавления комментария
![](/images/dot.gif)