2. Сообщение WM_ERASEBKGROUND, которое указывает, что надо восстановить фон. По этому сообщению функция DefWindowProcC) закрасит дефектный участок рабочей области кистью, указанной при регистрации оконного класса в поле hbrBackground структуры WNDCLASS. Чтобы DefWi ndowProc() стирала только дефектный участок, параметром wParam передается дескриптор контекста устройства, в котором занесена соответствующая область отсечения.
Если приложение, как в примере с вращением отрезка, само заполняет фон в рабочей области окна, данное сообщение лучше явно обработать при помощи ветки case WM_ERASEBKGROUND: return 0 и выйти из оконной процедуры без запуска DefWindowProcC). Это позволит не закрашивать фон дважды.
3. Сообщение WM_PAINT, по которому приложение получает информацию о требующем восстановления регионе в рабочей области окна. Поскольку информацию о дефектной области нельзя передать параметром сообщения, то приложение, получив WM_PAINT, должно вызовом функции BeginPaint(&ps) заполнить структуру ps типа PAINTSTRUCT, как показано в листинге 3.9.
Листинг 3.9
typedef struct tagPAINTSTRUCT {
HDC hdc; //Идентификатор контекста устройства.
BOOL fErase; //Флаг необходимости обновления фона окна самим приложением. RECT rcPaint; //Начальные координаты и габариты обновляемой области. BOOL fRestore; //Резервное поле. BOOL flncUpdate; //Резервное поле. BYTE rgbReserved[16]; //Резервное поле. } PAINTSTRUCT: Первым полем структуры PAINTSTRUCT является дескриптор контекста устройства ps. hdc. Это же значение функция Begi nPai nt() возвращает в качестве результата. Контекст, создаваемый вызовом GetDCC), использует в качестве области отсечения всю видимую часть окна. Контекст, создаваемый вызовом BeginPaintO, в отличие от получаемого по GetDCC), использует пересечение видимой части и области, требующей обновления.
Габариты дефектной области дублируются также в поле rcPai nt, откуда их легко прочитать. Позже мы увидим, как можно показать на экране точную форму дефектной области.
Второе поле fErase равно нулю, если система функцией DefWi ndowProcC) уже очистила рабочую область. Если при получении сообщения WM_ERASEBKGND функция DefWindowProcC) не выполнялась или не смогла очистить окно, то приложение информируется о необходимости самостоятельной заливки фона при помощи присвоения единичного значения полю fErase.