progs.biz  
Начало>WinAPI>API>Урок 13
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
Обзор книг
Обзор программ

Алексей Дубовцев Microsoft .NET. Наиболее полное руководство.
Алексей Дубовцев Microsoft .NET. Наиболее полное руководство.
Заказать на Озоне



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

Windows API
Урок 13. Рисование в окне - основы

Для рисования в окне мы должны добавить в оконную процедуру обработчик для сообщения Windows WM_PAINT. Обратите внимание, что все рисование происходит именно в обработчике WM_PAINT. Если нам надо нарисовать что-нибудь, например, по левой кнопке мыши, то все равно рисование надо делать не в обработчике WM_LBUTTONDOWN, а в WM_PAINT.

С точки зрения устройства Windows рисование происходит не на самом окне, а на некотором промежуточном слое, который присоединен к окну. Этот промежуточный слой называется контекстом устройства (device context). Т. е. сначала мы должны создать контекст устройства, присоединенный именно к нашему окну, а потом в этом контексте устройства рисовать.

Вот пример кода, рисующего прямоугольник:

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    // Объявляем контекст устройства.
    HDC hdc;
    // Объявляем структуру для рисования.
    PAINTSTRUCT ps;
    switch (Message){
        case WM_PAINT:
            // Присоединяем контекст устройства к окну.
            hdc = BeginPaint(hwnd, &ps);
            // Рисуем прямоугольник.
            Rectangle(hdc, 10, 10, 40, 80);
            // Заканчиваем рисование.
            EndPaint(hwnd, &ps);
            break;
            ...

Как вы видите, для рисования мы объявили 2 переменные - hdc и ps. Последняя переменная имеет тип PAINTSTRUCT и нигде не используется, кроме как в вызовах 2 API-функций - BeginPaint и EndPaint. Эта структура у Microsoft плохо документирована - про многие ее поля в MSDN написано, что они зареpзервированны для работы Windows и все. Поэтому мы ничего с ней не делаем, кроме подстановки в качестве параметра в 2 указанные функции. В начале обработчика WM_PAINT мы вызываем BeginPaint, в конце - EndPaint. Основное предназначение BeginPaint - это присоединение контекста устройства к нашему окну (окно определяется первым параметром BeginPaint, а присоединенный контекст устройства - возвращаемым функцией значением).

После того, как мы получили контекст устройства, в нем можно рисовать. Мы рисуем просто прямоугольник. Это мы делаем путем вызова API-функции Rectangle. Обратите внимание, что первым параметром у этой функции идет контекст устройства hdc. Такой первый параметр имеют все функции для рисования. Конкретно для прямоугольника остальные 4 параметра - это координаты его двух противоположенных углов - левого верхнего и правого нижнего.

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

Рассылки нашего сайта на 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 Игорь Алексеев