Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI-ekz_shpory.docx
Скачиваний:
11
Добавлен:
25.09.2019
Размер:
185.19 Кб
Скачать

5. Контекст физического устройства

Вывод изображений на такое устройство, как принтер, может выполняться с использованием тех же приемов, что и вывод в окно приложения. Прежде всего, необходимо получить контекст устройства. Затем можно вызывать функции GDI, выполняющие рисование, передавая им идентификатор полученного контекста в качестве параметра.

Он не получается, а создается:

HDC WINAPI CreateDC(

LPCSTR lpszDriver, // имя драйвера

LPCSTR lpszDevice, // имя устройства

LPCSTR lpszOutput, // имя файла или порта вывода

const void FAR* lpvInitData); // данные для инициализации

Созданный при помощи функции CreateDC контекст устройства следует удалить (но не освободить), вызвав функцию DeleteDC:

BOOL WINAPI DeleteDC(HDC hdc);

  1. Последовательность действий приложения при формировании рисунка

Как правило, приложения выполняют всю работу по рисованию во время обработки сообщения WM_PAINT, хотя часто требуется рисовать и во время обработки других сообщений.

В любом случае приложение должно придерживаться следующей последовательности действий при формировании рисунка:

1. Получение или создание контекста отображения;

2. Установка необходимых атрибутов в контексте отображения;

3. Выполнение операций рисования;

4. Освобождение или удаление контекста отображения.

Последнее действие (освобождение или удаление контекста отображения) должно быть обязательно выполнено. Самый простой способ полностью нарушить работоспособность Windows - забыть освободить полученный контекст отображения или удалить созданный контекст отображения или устройства.

Так как контекст отображения - критический ресурс, его необходимо освобождать сразу, как только в нем отпадет необходимость. Операционная система Windows выполняет кеширование обычного контекста отображения (есть и необычные контексты отображения, но об этом позже), причем кешируются только пять контекстов. Если Windows не может удовлетворить запрос какого-либо приложения на выделение контекста отображения, вся операционная система окажется в критическом состоянии, единственным выходом из которого будет полный перезапуск Windows.

Таким образом, при обработке сообщения WM_PAINT (при формировании рисунка) происходит следующая последовательность действий:

PAINTSTRUCT ps; // Задаем пустую структуру, для послед. использования при рисовании

HDC hdc; // Указатель на структуру контекста отображения

........

case WM_PAINT:

{

// Получаем контекст отображения

hdc = BeginPaint(hwnd, &ps);

// После получения контекста отображения можно вызывать функции GDI

TextOut(hdc, 0, 0, (LPSTR)"String", 6);

.

.

// Освобождаем контекст отображения

EndPaint(hwnd, &ps);

break;

}

Функции BeginPaint и EndPaint можно использовать только внутри обработчика сообщения WM_PAINT. Если же приложению требуется рисовать во время обработки других сообщений, оно должно получить контекст отображения с помощью функции: HDC WINAPI GetDC(HWND hwnd);

После завершения процедуры рисования перед выходом из обработчика сообщения следует освободить полученный контекст отображения, вызвав функцию ReleaseDC:

int WINAPI ReleaseDC(HWND hwnd, HDC hdc);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]