Графика в оконных приложениях

Создание Windows-приложений / Графика в оконных приложениях

 

Для рисования графических примитивов в оконных приложениях используются 4 основных типа объектов:

  • точка (Pixel);
  • перо (Pen);
  • кисть (Brush);
  • фон (Background).

 

Точка

Цвет точки задается с помощью функции

 
 
 
 
 
COLORREF SetPixel(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int X, // x-координата точки
_In_ int Y, // y-координата точки
_In_ COLORREF crColor ); // цвет точки


В случае удачного завершения возвращаемое значение функции дублирует цвет точки, в случае ошибки возвращает -1.

Цвет точки представляет собой 32-битное число, заданное в системе RGB:
RGB

Можно также воспользоваться функцией
 
 
 
 
RGB(
_ Red As Integer, // красный
_ Green As Integer, // зеленый
_ Blue As Integer); // синий


Значения красного, зеленого и синего используются в диапазоне 0…255.

 

Перо

Перо используется для рисования линий и контуров замкнутых фигур. Цвет пера задается функцией

 
 
 
 
HPEN CreatePen(
_In_ int fnPenStyle, // стиль пера
_In_ int nWidth, // ширина пера (в пикселях)
_In_ COLORREF crColor ); // цвет пера


Стили пера fnPenStyle могут быть заданы согласно таблице

Значение Тип Описание
PS_SOLID 0 PS_SOLID Сплошное перо
PS_DASH 1 PS_DASH Прерывистое (пунктирное) перо.
PS_DOT 2 PS_DOT Точечное (штриховое) перо.
PS_DASHDOT 3 PS_DASHDOT Штрих-пунктир
PS_DASHDOTDOT 4 PS_DASHDOTDOT Две точки - пунктир
PS_NULL 5 Невидимое перо

 
При успешном завершении функция возвращает дескриптор пера, в случае неудачи - константу NULL.

 

Кисть

Кисть используется для закрашивания замкнутых объектов. Цвет кисти задается с помощью функции

 
 
HBRUSH CreateSolidBrush(
_In_ COLORREF crColor ); // цвет кисти


При успешном завершении функция возвращает дескриптор кисти, в случае неудачи - константу NULL.
Эта же функция используется для задания цвета фона.

Можно заранее создать несколько кистей и перьев, а затем выбирать нужные с помощью функции
 
 
 
HGDIOBJ SelectObject(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ HGDIOBJ hgdiobj ); // дескриптор объекта


 

Рисование графических примитивов

Перемещение в указанную точку осуществляется функцией:

 
 
 
 
 
BOOL MoveToEx(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int X, // координата x точки
_In_ int Y, // координата y точки
_Out_ LPPOINT lpPoint ); // указатель на структуру POINT


Координаты точки x и у определяются в пикселях относительно левого верхнего угла.
В случае успешного выполнения возвращает ненулевое значение.

Структура POINT имеет вид
 
 
 
typedef struct tagPOINT {
LONG x;
LONG y; } POINT, *PPOINT;


Рисование отрезков осуществляется функцией:
 
 
 
 
BOOL LineTo(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nXEnd, // координата x конечной точки
_In_ int nYEnd ); // координата y конечной точки

В случае успешного выполнения возвращает ненулевое значение.

Рисование прямоугольника осуществляется функцией:
 
 
 
 
 
 
BOOL Rectangle(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect); // координата нижнего правого угла

Рисование прямоугольника начинается из точки, в которую осуществлено перемещение с помощью функции MoveTo().
В случае успешного выполнения возвращает ненулевое значение.

Рисование эллипса осуществляется функцией:
 
 
 
 
 
 
BOOL Ellipse(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect); // координата нижнего правого угла

Овал
В случае успешного выполнения возвращает ненулевое значение.

Рисование дуги осуществляется функцией:
 
 
 
 
 
 
 
 
 
 
BOOL ArcTo(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nLeftRect, // x-координата верхнего левого угла
_In_ int nTopRect, // y-координата верхнего левого угла
_In_ int nRightRect, // x-координата нижнего правого угла
_In_ int nBottomRect, // y-координата нижнего правого угла
_In_ int nXRadial1, // x- координата конца первого радиуса
_In_ int nYRadial1, // y- координата конца первого радиуса
_In_ int nXRadial2, // x- координата конца второго радиуса
_In_ int nYRadial2 ); // y- координата конца второго радиуса

Дуга
В случае успешного выполнения возвращает ненулевое значение.

 

Вывод текста в окно

Для вывода текста в поле окна используется функция

 
 
 
 
 
 
BOOL TextOut(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ int nXStart, // x-координата начала вывода текста
_In_ int nYStart, // y-координата начала вывода текста
_In_ LPCTSTR lpString, // указатель на строку текста
_In_ int cchString ); // количество символов для вывода

В случае успешного выполнения возвращает ненулевое значение.

Задать цвет фона под буквами можно с помощью функции
 
 
 
COLORREF SetBkColor(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ COLORREF crColor ); // цвет


Задать цвет букв можно с помощью функции
 
 
 
COLORREF SetЕTextColor(
_In_ HDC hdc, // дескриптор контекста устройства
_In_ COLORREF crColor ); // цвет


В случае неудачного завершения эти функции возвращают константу CLR_INVALID=0xFFFF.

 

Использование графических функций

Для перерисовки окна, в котором будут отображаться графические объекты, будем использовать обработку сообщения WM_PAINT.

Обработка сообщения WM_PAINT почти всегда начинается с вызова функции:

 
 
 
HDC BeginPaint(
_In_ HWND hwnd,
_Out_ LPPAINTSTRUCT lpPaint );


При обработке вызова BeginPaint(), Windows обновляет фон рабочей области с помощью кисти, заданной в поле hbrBackground структуры WNDCLASS, описанной здесь. Вызов BeginPaint() делает всю рабочую область действительной (не требующей перерисовки) и возвращает описатель контекста устройства. Контекст устройства описывает физическое устройство вывода информации (например, экран) и его драйвер. Описатель контекста устройства необходим для вывода в рабочую область окна текста и графики.

Аргументы функции:

  • hwnd – дескриптор окна;
  • lpPaint – указатель на структуру PAINTSTRUCT.

Структура PAINTSTRUCT имеет вид

 
 
 
 
 
 
 
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT;


Члены структуры:

  • hdc – дескриптор контекста устройства.
  • fErase – ненулевое значение стирает фон.
  • rcPaint – структура RECT, определяющая верхний левый и нижний правый углы рабочей области.
     
     
     
    typedef struct _RECT {
    LONG left; LONG top;
    LONG right; LONG bottom; } RECT, *PRECT;
  • fRestore, fIncUpdate, rgbReserved  – зарезервировано, используется системой.

Обработка сообщения WM_PAINT почти всегда заканчивается вызовом функции:

 
 
 
BOOL EndPaint(
_In_ HWND hWnd,
_In_ const PAINTSTRUCT *lpPaint );


Функция EndPaint() освобождает описатель контекста устройства, после чего его значение нельзя использовать. Возвращает всегда ненулевое значение.

Получение дескриптора контекста устройства осуществляется вызовом функции:
 
HDC GetDC(_In_ HWND hWnd);

hWnd – дескриптор окна, для которого используется контекст устройства.
Возвращаемое значение – дескриптор контекста устройства.

Функция
 
 
 
int ReleaseDC(
_In_ HWND hWnd,
_In_ HDC hDC );

освобождает контекст устройства hDC для данного окна hWnd, после чего значение контекста устройства нельзя использовать. Возвращает всегда ненулевое значение.

Пример График функции y=sin(x).


Назад: Создание Windows-приложений

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *