После того, как окно создано, приложение может использовать его рабочую область как угодно. Если там необходимо что-либо нарисовать или вывести текст, то возникают следующие проблемы:
· неизвестны границы рабочей области,
· неизвестно когда будет происходить вывод,
· кроме непосредственно вывода существуют ситуации, когда содержимое рабочей области надо восстановить (например, окна могут перекрывать друг друга).
Когда приложению требуется обновить рабочую область, то ему посылается сообщение 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, содержит координаты верхнего левого и правого нижнего угла прямоугольника, внутри которого нужно что-то рисовать.
|
|
Windows отслеживает координаты той области (invalid rectangle), которой нужно обновление, чтобы не перерисовывать все окно.
Сообщение WM_PAINT имеет самый низкий приоритет. Оно помещается в очередь приложения, когда область invalid rectangle не пуста и нет других сообщений.
Перед сообщением WM_PAINT посылается сообщение WM_ERASEBKGRN. Если это сообщение не обрабатывать, то по умолчанию рабочая область будет закрашиваться кистью, определенной при регистрации окна. Если рисовать в окне во время обработки других сообщений, то перед приходом WM_PAINT все будет закрашено фоном.
Если перерисовать надо немедленно, то для посылки WM_PAINT надо послать не в очередь, а напрямую в функцию окна функциями
· пометить область как требующую обновления – InvalidateRect (NULL, NULL, TRUE). Значения параметров означают: главное окно, вся область, фон будет стерт.
· вызвать функцию UpdateWindow(hWnd);