progs.biz  
Начало>WinAPI>API>Урок 17
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

М. Фленов. Программирование на C++ глазами хакера
М. Фленов. Программирование на C++ глазами хакера
Заказать на Озоне



Яндекс-цитирования

Windows API
Урок 17. Создаем и закрашиваем регион

Регионы позволяют нам работать с непрямоугольными областями. Использование регионов может быть самое разное - от создания непрямоугольных окон до определения, попали мы мышкой в некоторую непрямоугольную область (которая и будет задаваться регионом). На этом уроке мы посмотрим, как с помощью региона создать область неправильной формы и закрасить ее.

Вот код для рисования области, ограниченной некоторой ломанной:

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    ...
    // Создаем и заполняем массив точек.
    POINT pt[3] = {{10, 10}, {100, 10}, {20, 120}};
    ...
    switch (Message){
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            // Объявляем и создаем рагион на основе массива точек.
            HRGN rg;
            rg = CreatePolygonRgn(pt, 3, WINDING);
            // Заполяем регион желтым цветом.
            FillRgn(hdc, rg, CreateSolidBrush(RGB(255, 255, 0)));
            EndPaint(hwnd, &ps);
            break;
...

Результатом выполнения программы будет желтый треугольник:

Желтый треугольник на форме

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

POINT pt[5] = {{10, 30}, {100, 30}, {20, 120}, {50, 0}, {100, 100}};

и при значении для третьего параметра WINDING:

rg = CreatePolygonRgn(pt, 5, WINDING);

мы получим закрашенную внутри звезду:

Сплошная звезда на форме

А если третий параметр мы установим в ALTERNATE:

rg = CreatePolygonRgn(pt, 5, ALTERNATE);

то получим звезду с частично незакрашенной внутренней областью:

Звезда с дыркой
Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев