Выполнить такую же проверку функции UpdateWi ndow().
6. Проверить, действительно ли можно в проекте minim заменить функцию DispatchMessageO функцией SendMessageO или непосредственным вызовом оконной процедуры. Если да, то оцените, на сколько процентов уменьшаются затраты на обработку сообщений. Сравните результаты для различных версий операционной системы.
7. Составить программу, которая по нажатии левой кнопки мыши выводит на экран координаты мыши в рабочей области окна.
8. Составить программу, которая на основе проверки сообщений, выбираемых из очереди функцией GetMessageO в структуру MSG, подменяет сообщения о нажатии клавиш управления курсором сообщениями WM_LBUTT0ND0WN, WM_RBUTT0ND0WN. Виртуальные коды указанных клавиш имеют названия VK_LEFT, VK_RIGHT. После того как нажатие клавиш со стрелками станет восприниматься программой как щелчки кнопками мыши, нужно объединить программы пп. 6 и 7. Следует убедиться в том, что при нажатии стрелок отображаемые координаты мыши соответствуют положению курсора в рабочей области окна.
Задания для самостоятельного выполнения
9. Составить программу, которая при перемещении мыши показывает текущие экранные координаты в заголовке окна. С параметрами сообщения к/М_М0\/Е можно ознакомиться в справочной системе.
10. Справочная система сообщает, что функция 11рс1а1е1лЛ пс!о\л/() посылает окну сообщение 1л1М_РА1МТ. Для проверки этих сведений нужно организовать подсчет количества запусков оконной процедуры, как это показано в листинге 4.11.
Листинг 4.11
int I:
LRESULT CALLBACK InputWndProc (HWND hWnd.UINT message.
WPARAM wParam.LPARAM lParam)
switch (message)
В оконную процедуру нужно добавить фрагмент, который обнуляет счетчик запусков перед вызовом UpdateWindow(), как показано в листинге 4.12.
Листинг 4.12
case WM_RBUTT0ND0WN:
I - 0;
Invali dateRect(hWnd.NULL.TRUE);
UpdateWindow(hWnd);
break;
Установив контрольный останов на операторе break, можно убедиться в том, что UpdateWindow() запускает оконную процедуру более одного раза. Измените эксперимент таким образом, чтобы определить, какие сообщения передает UpdateWindowO оконной процедуре. 11. В исходных текстах примеров, поставляемых с графическими библиотеками, можно найти фрагменты, в которых при обработке сообщения WM_PAINT сразу же вызываются функции Begi nPai nt() и EndPai nt(), после чего следует собственно обработка сообщения. Для программиста может быть интересной проверка причины такого отклонения от рекомендаций. Нужно изменить проект InvalidateRect таким образом, чтобы по щелчку левой кнопкой на экране появилось изображение, показанное на рис. 4.4. Для этого надо объявить дефектной только половину экрана и занести эту информацию в контекст устройства, как показано в листинге 4.13.