Функция 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.


⇐ Предыдущая| |Следующая ⇒