Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

П 3.2. Сообщение wm_paint

Стремление описывать вывод в окно при. обработке сообщения WM_PAINT. объясняется следующим. Windows следит за изменением расположения окон и при необходимости перерисовки окна посылает функции окна сообщение WM_PAINT. Функция окна при обработке это­го сообщения перерисовывает все окно или указанные части.

Сообщение WM_PAINT обрабатывают следующим образом:

Case WM_PAINT:

{ PAINTSTRUCT ps;

HDC hdc=BeginPaint(hwnd, &ps);

//Здесь настраивают контекст отображения и выводят в окно

EndPaint(hwnd, &ps);

return 0;

}

Структура PAINTSTRUCT описана следующим образом:

typedef struct { HDC hdc;

BOOL Erase;

RECT rcPaint;

BOOL fRestore;

BOOL flncUpdate;

BYTE rgbReserved(16];

} PAINTSTRUCT;

Поля переменной ps заполняет функция BeginPaint. Поеле ее вызова поле hdc структуры ps содержит дескриптор контекста отображения (тот же, который возвращает функция BeginPaint). Поле rcPaint содержит ко­ординаты прямоугольной области обновления. Поле fErase определяет необходимость стирания фона области обновления. Если fErase=TRUE фон окна стирается, иначе фон окна не изменяется. Остальные поля ис­пользует операционная система, приложение не должно изменять их со­держимое.

После выполнения операций вывода приложение освобождает ис­пользуемые ресурсы - вызывает функцию EndPaint.

Представим теперь, что содержимое окна требуется обновить при обработке других сообщений. Для этого функции обновляемого окна достаточно передать сообщение WM_PAINT.

Одна из функций, которые посылают сообщение WM_PAINT, а именно UpdateWindow, использовалась ранее.

Эта функция объявлена следующим образом:

BOOL UpdateWindow( HWND hwnd);

Она посылает сообщение WM_PAINT непосредственно функции ок­на hwnd. В случае успешного выполнения функция UpdateWmdow воз­вращает ненулевое значение, иначе - 0. Обычно ее вызывают для немед­ленной перерисовки области обновления.

Функция InvalidateRect добавляет прямоугольник в область перери­совки окна hwnd. Она объявлена следующим образом:

BOOL lnvalidateRect( HWND hwnd, CONST RECT *lpRect, BOOLbErase);

Параметр hwnd указывает на обновляемое окно. Если это параметр указывает на NULL, перерисовывают все окна. Параметр IpRect указыва­ет на нуждающийся в обновлении прямоугольник в рабочей области. Ес­ли lpRect=NULL, то нужно обновить всю рабочую область окна hwnd. Параметр bErase определяет, нужно ли перекрасить фон указанной пря­моугольной области. Если bErase=TRUE, фон перекрашивают, иначе фон остается неизменным.

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

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

Функция ValidateRect удаляет прямоугольную область из списка прямоугольников перерисовки. Прототип этой функции:

BOOL ValidateRect( HWND hwnd, CONST RECT IpRect);

Параметр hwnd указывает на окно, из области перерисовки которого исключается прямоугольник. Если этот параметр NULL, Windows пере­рисовывает все окна - посылает сообщения WM_ERASEBKGND и WM_ NCPAINT функциям всех окон. Параметр IpRect указывает на прямо­угольник, который будет удален от области перерисовки. Если lpRect=NULL, из области обновления удаляют все прямоугольники.

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

Функция BeginPaint из области обновления удаляет всю рабочую об­ласть окна.