Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOS / Дисциплины специализации.doc
Скачиваний:
42
Добавлен:
09.05.2015
Размер:
1.61 Mб
Скачать

7. Интерфейс графических устройств cdi. Кисть, карандаш, примитивы.

Графический интерфейс устройства ( graphics device interface (GDI) ) – это составная часть Win32 API, обеспечивающая графический вывод на устройства отображения информации, такие как дисплей или принтер. Windows-приложение не имеет непосредственного доступа к устройствам. Вместо этого оно обращается к функциям GDI, а GDI транслирует эти обращения к программным драйверам физических устройств, обеспечивая аппаратную независимость приложений. Код библиотеки находится в файле gdi32.dll, то есть библиотека является динамически загружаемой.

Взаимодействие приложения с GDI осуществляется при участии т.н. контекста устройства.

Контекст устройства ( device context ) – внутренняя структура данных, которая определяет набор графических объектов и ассоциированных с ними атрибутов, а также графических режимов, влияющих на вывод.

Основные графические объекты:

  • Карандаш (pen) для рисования линий

  • Кисть (brush) для заполнения фона или заливки фигур

  • Растровое изображение (bitmap) для отображения в указанной области окна

  • Палитра (palette) для определения набора доступных цветов.

  • Шрифт (font) для вывода текста

  • Регион (region) для отсечения области вывода.

Если необходимо рисовать на устройстве графического вывода, то сначала необходимо получить дескриптор контекста устройства. Возвращая дескриптор, Windows тем самым предоставляет право на использование устройства.

Рассмотрим на примере рисования в области окна приложения.

Первый способ получения DC: Использование при обработке WM_PAINT:

Case WM_PAINT:

hDC = BeginPaint( hWnd, &ps );

[используем GDI]

EndPaint( hWnd, &ps );

Return 0;

Второй способ:

hDC = GetDc( hwnd );

[используем GDI]

releaseDC( hwnd, hDC );

Чаще всего функции рисования используются при обработке сообщения WM_PAINT. Система всегда посылает такой сигнал приложения при необходимости перерисовки клиентской области окна

Сообщение WM_PAINT можно вызвать вручную, используя функцию UpdateWindow().

Использование

Любая линия в Windows рисуется с использованием графического объекта, называемого пером ( карандаш ). Контекст устройства содержит перо по умолчанию – сплошное перо черного цвета толщиной в 1 пиксель. Многие графические функции начинают рисование с так называемой текущей позиции пера.

Получение дескриптора стандартного объекта:

hPen = GetStockObject( WHITE_PEN );

Присваивание объекта контексту устройства:

SelectObect( hDC, hPen );

Для перьев ( и для других объектов ) рекомендуется после использования удалять объекты:

DeleteObject( hPen );

Создание нестандартного пера:

HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor );

Первый параметр – стиль. Второй – толщина. Третий – цвет.

Расширенные перья:

HPEN ExtCreatePen(

DWORD dwPenStyle, // тип, стиль и атрибуты пера

DWORD dwWidth, // толщина

CONST LOGBRUSH* lplb, // атрибуты кисти

DWORD dwStyleCount, // длина массива lpStyle

CONST DWORD* lpStyle // массив, задающий правила чередования пикселов

);

Существуют и другие типы перьев.

Передвижение текущего указателя пера:

BOOL MoveToEx(

HDC hdc,

Int x,

Int y,

LPPOINT lpPoint // предыдущая позиция пера

);

Кисть – это растр 8*8 пикселов, который при закрашивании области дублируется в горизонтальном и вертикальном направлении. Используется, например, при рисовании заполненного прямоугольника.

Стандартные кисти создаются так же, как и карандаш:

hBrush = (HBRUSH) GetStockObject( GRAY_BRUSH );

Пользовательские кисти:

HBRUSH CreateSolidBrush( COLORREF crColor );

Штриховые кисти:

CreateHatchBrush( int fnStyle, COLORREF clrref );

Растровые кисти:

HBRUSH CreatePatternBrush( HBITMAP hbmp );

Примитивы.

Линия:

LineTo( hdc, x, y ); // рисует линию от текущей позиции пера до указанной точки.

Прямоугольник:

Rectangle( hdc, xLeft, xRight, yTop, xRight, yBottom ); // прямоугольник, закрашенный текущей кистью.

lprc – ссылка на структуру RECT.

hbr – кисть.

Эллипс:

Ellipse( hdc, xLeft, xRight, yTop, xRight, yBottom );

Простейший вывод текста:

TextOut( hdc, nXStart, nYStart, lpString, cbString );

lpString – указатель на символьную строку.

cbString – число символов в строке.