Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI_theory.doc
Скачиваний:
10
Добавлен:
14.11.2018
Размер:
852.48 Кб
Скачать
  1. Основы вывода

После того, как окно создано, приложение может использовать его рабочую область как угодно. Если там необходимо что-либо нарисовать или вывести текст, то возникают следующие проблемы:

  • неизвестны границы рабочей области,

  • неизвестно когда будет происходить вывод,

  • кроме непосредственно вывода существуют ситуации, когда содержимое рабочей области надо восстановить (например, окна могут перекрывать друг друга).

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

Часть проблем решает сама ОС Windows. Это перерисовка окна при перемещении и восстановление фона окна.

Область, которую надо перерисовать, определяется в следующей структуре:

typedef struct tagPAINTSTRUCT

{

HDC hdc;//идентификатор контекста устройства

BOOL fErase; //=TRUE посылается сообщение WM_ERASEBKGRN и фон обновляется

RECT rcPaint;// область отрисовки

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[16];

} PAINTSTRUCT;

Поле rcPaint, которое представляет собой структуру типа RECT, содержит координаты верхнего левого и правого нижнего угла прямоугольника, внутри которого нужно что-то рисовать.

typedef struct tagRECT

{

int left;

int top;

int right;

int bottom;

} RECT;

Windows отслеживает координаты той области (invalid rectangle), которой нужно обновление, чтобы не перерисовывать все окно.

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

Перед сообщением WM_PAINT посылается сообщение WM_ERASEBKGRN. Если это сообщение не обрабатывать, то по умолчанию рабочая область будет закрашиваться кистью, определенной при регистрации окна. Если рисовать в окне во время обработки других сообщений, то перед приходом WM_PAINT все будет закрашено фоном.

Если перерисовать надо немедленно, то для посылки WM_PAINT надо послать не в очередь, а напрямую в функцию окна функциями

  • пометить область как требующую обновления – InvalidateRect (NULL, NULL, TRUE). Значения параметров означают: главное окно, вся область, фон будет стерт.

  • вызвать функцию UpdateWindow(hWnd);

  1. Контекст устройства

Контекст устройства выступает в роли связующего звена между приложением и драйвером устройства (дисплей, принтер, плоттер, память) и представляет собой структуру данных размером около 800 байт. Эта структура данных содержит информацию о том, как нужно выполнять операции вывода на данном устройстве (например, цвет и толщину линии, тип системы координат и т. д.)

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

Чтобы начать рисовать, контекст отображения надо получить (об этом следующая глава). При этом все атрибуты контекста будут иметь значения, установленные по умолчанию. Рассмотрим, какие параметры есть у контекста и как их изменять.

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