Исходные коды программ и игр
программируй и твори!

Исходный код применения двоичных данных регионов для GDI и GDI+

исходные коды на языке программирования С++
В исходнике описаны уникальные возможности использования двоичных данных регионов. Используя регионы можно создавать окна программ любой формы. Двоичные данные региона HRGN(CRgn, Region), в MFC для хранения данных регионов используется структура RGNDATA. RGNDATA содержит массив прямоугольных областей ограничения прорисовки объекта. С помощью регионов можно по собственному замыслу определить границы рисования окна приложения на рабочем столе, границы рисования изображений в рабочем окне приложения, определить попадание в непрямоугольную область указателя мыши.

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

        CreateRectRgn() - создает прямоугольную область ограничения

        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) предлагается программа RgnCreator2.0(находится в разделе прикладные программы). Очень проста в использовании, предоставляет выбор цвета исключения указателем мыши, тестирует результат создания региона.

Исходники примеров применения двоичных данных региона на С++ и C#, среда программирования Visual Studio.NET 2003. Среда выполнения приложения Win98 и выше. Архив исходников содержит исходные коды без применения MFC, с применением MFC, исходный код для среды .NET.
Файл исходникаКоличество загрузокРазмер
examplergn.rar3397633 КБ

<< Исходный код сетевой карточной игры вверх Исходник проверки простого числа >>
Дополнительные источники

 

Яндекс цитирования Rambler's Top100