Листинг 3.14
LRESULT APIENTRY InputWndProc (HWND hWnd. UINT message.WPARAM
wParam.LPARAM lParam)
{
PAINTSTRUCT ps;
RECT R « {40.40.80.80};
RECT Rl - {20.20.100.100}:
switch (message)
{
case WMJ.BUTTONUP:
InvalidateRect(hWnd.NULL.FALSE); //Объявили все окно дефектным. BeginPaint(hWnd.&ps): //Занесли дефектную область в контекст. SendMessage(hWnd.WMJRASEBKGND. (unsigned)ps. hdc. 0): //Все стерли. EndPaint(hWnd.&ps):
InvalidateRectChWnd.&Rl.TRUE); //По WMJRASEBKGND окно было очищено.
ValidateRect(hWnd.&R):
break;
case WM_PAINT: {
BeginPaint(hWnd.&ps);
for ( int i-0: i<30;i++) //Рисование выходящих из угла лучей продолжение т&
Элементы компьютерной графики
Листинг 3.14 {продолжение)
{
MoveToExC ps.hdc.О.О.NULL): LineToCps.hdc.8*1.250); MoveToExC ps.hdc.0.0.NULL): LineTo(ps.hdc.250.9*i): }
EndPaint(hWnd.&ps):
return 0;
}
case WM_RBUTT0ND0WN:
Invali dateRect(hWnd.NULL.TRUE);
break ;
case WM_DESTR0Y:
PostQuitMessage(O);
break;
}
return DefWindowProc(hWnd.message,wParam.lParam): }
После щелчка левой кнопкой мыши сначала объявляется дефектной вся рабочая область, потом при помощи функции Begi nPai nt ( ) создается контекст изображения. Функция SendMessage(hWnd.WM_ERASEBKGND, (unsigned int) ps.hdc, 0) вызывает оконную процедуру и передает ей этот контекст, в результате обработчик DefWi ndowProc( ) очистит окно и удалит дефектную область. После очистки сформируется новая дефектная область, и в очередь помещается сообщение WM_PAINT, которое приведет к формированию окна, показанного на рис. 3.5 слева.
Данный пример показывает, что вызов Begi nPai nt ( ) можно использовать везде, где нужно занести дефектную область в контекст устройства, а не только при обработке сообщения WM_PAI NT. Использовать GetDC ( ) по щелчку левой кнопкой нельзя, так как в контекст будет занесена видимая область, а дефектная область в контексте не сформируется и фон не очистится.
Фон очищается процедурой DefWindowProcC ), поэтому ее можно было вызвать и без посредников. Вместо SendMessage( ) можно было вызвать функцию DefWindow-Proc(hWnd.WM_ERASEBKGND, (unsigned) ps.hdc.O).