Фигурные окна с помощью RGNDATA, RegionData

Все исходники / Язык программирования C++ / OS Windows / Desktop / Исходники приложений / Фигурные окна с помощью RGNDATA, RegionData

Исходник применения двоичных данных

Исходные коды описывают потрясающие свойства применения двоичных данных регионов структур и классов class CRgn, class Region, struct RGNDATA, class RegionData. Используя регионы можно создавать окна приложений любой формы и узоры любой сложности.

Двоичные данные регионов в Win32 и MFC struct RGNDATA, в .NET class RegionData. Данные регионов содержат массив прямоугольных областей ограничения прорисовки объекта. С помощью регионов можно по собственному замыслу определить форму окна приложения на рабочем столе, границы рисования изображений в рабочем окне приложения, определить попадание в непрямоугольную область указателя мыши.

Методы создания регионов

Создавать области ограничения рисования любой сложности нам предоставляет функциональность Windows API. Из методов создания регионов можно выделить две основные:

  • HRGN CreateRectRgn(...) - создает прямоугольную область ограничения
  • int CombineRgn(...) - создает на основе двух регионов третий по определенному алгоритму комбинирования.

С помощью этих методов можно создавать области ограничения любой конфигурации. Этот эффект достигается благодаря прямоугольной интерпретации наших мониторов. Наименьшая точка - пиксель имеет прямоугольную форму и определяет точность создания желаемого региона. Создать окно приложения прямоугольной формы , прямоугольной с закругленными углами , эллиптической и многоугольной можно с помощью "простых" методов. Но если задумано изготовить окно особой, оригинальной формы или нарисовать узор сложной конфигурации, то тут не обойтись без многочисленной комбинации простых регионов.

Создание регионов по битовым массивам

Огромную "помощь" в создании сложных областей ограничения могут оказать битовые рисунки. Принцип построения регионов с помощью битовых массивов основан на их комбинации с установленным флагом исключения определенной области.Последовательность создания региона на основе битового массива:

  1. Выбирается цвет исключения из основного региона (для упрощения назовем его цветом прозрачности)
  2. Создается основной регион прямоугольной формы с габаритными размерами как у картинки (.bmp)
  3. Сканируется битовый массив на предмет обнаружения пикселя с цветом прозрачности, на основе найденного пикселя создается второй регион размером 1х1 пиксель (выбор пикселя в качестве региона позволяет создавать желаемый регион с максимальной точностью)
  4. Комбинируются два региона с помощью функции int CombineRgn( HRGN hrgnDest, HRGN hrgnSrc1, HRGN hrgnSrc2, int fnCombineMode ) с режимом комбинирования RGN_XOR. В итоге в hrgnDest получается регион hrgnSrc1 за вычетом области отсечения hrgnSrc2
  5. Продолжается сканироваться битовый массив на предмет обнаружения следующего пикселя с цветом прозрачности. Снова создается регион размером 1х1 пиксель
  6. Комбинируются два региона, но теперь в качестве первого берется регион-результат предыдущего сканирования, в качестве второго регион обнаруженного следующего пикселя прозрачности. В результате получается новый регион за вычетом предыдущих областей
  7. Цикл замыкается, битовый массив сканируется далее до последнего пикселя. На основе таких циклов создания и комбинирования регионов в итоге создается желаемый регион, в котором будут исключены все зоны выбранного цвета прозрачности

Исходники С++ с примерами

Для создания регионов произвольной формы по вашим картинкам (битовым массивам .bmp) предлагается программа RgnCreator, находится в разделе прикладные программы. Очень проста в использовании, предоставляет выбор цвета исключения указателем мыши, тестирует результат создания региона.

Исходники примеров применения двоичных данных региона написаны на языках программирования С++ и C#, среда программирования Visual Studio.NET 2003. Архив исходников содержит исходные коды Win32, с применением MFC, исходный код для среды .NET на языке C#.

Скачать исходник

Тема: «Фигурные окна с помощью RGNDATA, RegionData» Язык программирования С++ examplergn_vs8.zip Размер:772 КбайтЗагрузки:4712