Blog. Just Blog

Окна нестандартной формы на Ассемблере. Часть 1

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Фигурная резьба по деревянным окнам - старинное народное творчество. А в нашем 21-м веке народным творчеством будет резьба по окнам Windows. При умелом использовании это станет стильным украшением для ваших приложений, добавив им привлекательности.

Форма окна определяется особыми структурами, называемыми регионами. Они могут быть прямоугольной формы, закругленной, эллиптической и многоугольной. Весь принцип работы с регионами сводится к следующему. Сперва создается главный регион, равный по размерам основному диалоговому окну, затем создаются дополнительные регионы нужного размера и накладываются на него с нужной битовой маской. Режимы наложения определяют будет ли новый регион удален из основного, или же наоборот добавлен. Размер главного региона лучше всего рассчитывать из результатов функции GetClientRect, вызванной с хэндлом нужного диалогового окна. Наложение регионов выполняется функцией CombineRgn, возможные режимы наложения смотрите в официальной документации. Все действия выполняются на этапе инициализации окна по событию WM_INITDIALOG.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. hRMain  dd ?   ; Хэндл главного региона окна
  5. coord   RECT   ; Координаты окна для вычисления размера региона
  6.         ...
В сегменте данных инициализируется хэндл главного региона окна и структура RECT с координатами диалогового окна, по которым будет рассчитываться размер главного региона.

Фрагмент обработчика WM_INITDIALOG, создающего окно нестандартной формы:
  1. ; Сегмент кода
  2. section '.code' code readable executable
  3.         ...
  4.         ; Получить размер окна
  5.         invoke  GetClientRect,[hwnddlg],coord
  6.  
  7.         ; Записать в стек размеры окна для создания главного региона
  8.         mov     eax,[coord.bottom]
  9.         sub     eax,[coord.top]
  10.         push    eax
  11.  
  12.         mov     eax,[coord.right]
  13.         sub     eax,[coord.left]
  14.         push    eax
  15.  
  16.         ; Создать главный регион диалогового окна
  17.         invoke  CreateRectRgn,0,0
  18.         mov     [hRMain],eax
  19.  
  20.         ; Вырезать прямоугольный регион (режим RGN_DIFF)
  21.         invoke  CreateRectRgn,0,60,268,63
  22.         push    eax
  23.         invoke  CombineRgn,[hRMain],[hRMain],eax,RGN_DIFF
  24.         ; Освободить хэндл и память региона
  25.         invoke  DeleteObject
  26.  
  27.         ; Добавить закругленный регион (режим RGN_OR)
  28.         invoke  CreateRoundRectRgn,14,117,110,132,15,15
  29.         push    eax
  30.         invoke  CombineRgn,[hRMain],[hRMain],eax,RGN_OR
  31.         ; Освободить хэндл и память региона
  32.         invoke  DeleteObject
  33.         ...
  34.         ; И так далее по очереди на главный регион накладываются
  35.         ; регионы нужного размера и формы
  36.         ...
  37.         ; Установить новый регион для окна и перерисовать его
  38.         invoke  SetWindowRgn,[hwnddlg],[hRMain],TRUE
  39.         ; Освободить хэндл и память главного региона
  40.         invoke  DeleteObject,[hRMain]
  41.         ...
Не забывайте освобождать хэндлы и память ненужных регионов функцией DeleteObject! Вот так, комбинируя функции создания прямоугольных и закругленных регионов, можно создавать простые окна нестандартной формы. Этот способ удобно использовать, когда надо отделить заголовок или меню от основного окна, сделать главное окно с закругленными углами или выполнить другие несложные модификации внешнего вида. Во второй части статьи подробно описано создание окон произвольной формы на основе графической маски.

В приложении пример диалогового окна с несколькими вырезанными прямоугольными регионами и одним добавленным закругленным регионом.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Simply.Window.Region.Demo.zip (2,693 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 5497 | Комментариев: 1

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

Комментарии

Отзывы посетителей сайта о статье
Rambler (06.10.2009 в 05:27):
THX!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 2 (0.0053 сек.) / Память: 4.5 Mb
Наверх