Функция InvalidateRect(HWND hWnd, RECT *lpRect, BOOL bErase) объявляет область окна, заданную параметром 1 pRect, дефектной, то есть требующей восстановления в ней рисунка. Если параметр 1 pRect равен NULL, то дефектным считается все окно.
Важно учитывать, что поведение операционной системы при создании дефектной области функцией Inval i dateRect () отличается тем, что в этом случае система порождает сообщение WM_PAINT, но не посылает окну сообщения WMJiRASEBKGND. Стиранием окна управляет третьий параметр bErase функции Inval idateRect().
Для демонстрации программного управления дефектной областью следует заменить в проекте minim оконную процедуру функцией, приведенной в листинге 3.12, и щелкнуть несколько раз в окне левой кнопкой мыши (проект InvalidateRectO).
Листинг 3.12
PAINTSTRUCT ps;
LRESULT APIENTRY InputWndProc (HWND hWnd.
продолжение хУ"
Элементы компьютерной графики
Листинг 3.12 {продолжение)
UINT message.WPARAM wParam.LPARAM lParam) {
static int iE-3:
//Состояние программы:
//3 - после первого вызова оконной функции:
//О - после щелчка кнопкой мыши:
111 - после прихода WMJRASEBKGND: static int iP - 3: //Состояние функции BeginPaintO:
//1 - функция BeginPaintO вызвана и выполняется:
112 - функция BeginPaintO завершена: switch (message)
{
case WM_DESTROY: PostQuitMessage(O): break:
case WMJBUTTONUP: iE - iP - 0:
Invali dateRect(hWnd.NULL.FALSE); return 0: case WMJAINT: {
iP - 1:
//Начало работы функции BeginPaint(hWnd.&ps):
// HDC hdc - GetDC(hWnd):
HDC hdc - BeginPaint(hWnd.&ps);
iP - 2:
//Завершение работы функции BeginPaint(hWnd.&ps);
static int i-0;
i+-10:
Rectangle(hdc.i.i.i +50.i +30):
EndPaintChWnd.&ps);
//ReleaseDC(hWnd.hdc):
}
break:
case WMJRASEBKGND: if (1E--0) iE-1:
return DefWindowProc(hWnd.message.wParam.1 Param); case WMJBUTTONDOWN: iE - iP - 0:
InvalidateRect(hWnd.NULL.TRUE): break:
}
return DefWindowProc(hWnd.message.wParamЛParam):
}
При каждом щелчке левой кнопкой мыши система сформирует область, заданную функцией Inval i dateRect (hWnd. NULL. FALSE), и пошлет в окно только сообщение WMJAINT.