}

В данном примере при определении размеров окна его дескриптор не передается функции RotateLiпе( ). Он запрашивается вызовом WindowFromDC(hdc) из связанного с окном контекста устройства.

Теперь нужно заменить в файле Minim.срр оконную процедуру, включив в нее запрос контекста устройства и вызов функции вращения отрезка, как показано в листинге 3.5.

Листинг 3.5

void RotateLine(dc); прототип функции вращения LRESULT API ENTRY InputWndProc (HWND hWnd. UINT message.

WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_DESTROY : {
PostQuitMessage(O); return 0;
}
case WM_RBUTT0ND0WN: {
HDC dc = GetDC(hWnd); RotateLine(de); ReleaseDC(hWnd.dc);
}
default:
return DefWindowProc(hwnd. message. wParam, lParam);
}
return 0; }

Теперь после нескольких щелчков правой кнопкой на экране появится изображение, показанное в правом окне рис. 3.1. Легко заметить, что после каждого щелчка рисуется новый отрезок и не стираются отрезки, выведенные ранее.

Теперь нужно закрыть на время часть изображения другим окном. Закрытая часть рисунка, как показано на рис. 3.1 слева, не восстановится. Если пользователь при помощи мыши изменяет размеры окна, изображение исчезает полностью. Причина этого заключается в том, что Windows формирует информацию об измененной и требующей восстановления области окна. Система может восстановить (и восстанавливает функцией DefWindowProc( )) то, что рисовала сама, то есть фон рабочей области, рамку и заголовок. Операционная система не знает, что рисовалось

Элементы компьютерной графики

приложением в его собственном окне. Система может лишь послать приложению сообщение WM_PAINT, сигнализирующее программе о необходимости восстановления изображения в дефектной области. Чтобы изображение не исчезало, вызов функции рисования можно вставить в оконную процедуру либо при первом рисовании, либо при восстановлении испорченного изображения, которое производится после получения сообщения WM_PAINT.

Заметим, что в нашем примере вызов RotateLine(dc) по сообщению WM_PAINT нарисует только один отрезок и не восстановит весь пучок прямых, так как он формировался в результате нескольких щелчков мышью. Для устранения этого недостатка существует два общепризнанных приема:


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