Лабораторная работа 1. Создание улучшенной прокрутки

Поскольку программа SYSMETS2 слишком неэффективна, как модель для повторения ее в других программах, давайте модифицируем ее. SYSMETS3 — наша окончательная версия программы SYSMETS. В этой версии нужно добавить горизонтальную полосу прокрутки для прокрутки рабочей области влево и вправо, и более эффективно организовать перерисовку рабочей области.

Далее рассматриваются улучшения в программе SYSMETS3 и рекомендации по их  реализации в программе:

Вы не можете прокручивать экран так, чтобы последняя строка оказалась на самом верху рабочей зоны окна. Процесс прокрутки продолжается только до появления последней строки текста в нижней части рабочей области. Для этого необходимо, чтобы программа рассчитала новый диапазон полосы прокрутки

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

Это решение дает интересный результат. Предположим, что рабочая область окна достаточно велика, чтобы вывести на экран весь текст, включая верхний и нижний отступы. В таком случае, и минимальное и максимальное положение диапазона полосы прокрутки будут равны 0. Что с этой информацией будет делать Windows? Она удалит полосу прокрутки из окна! Она больше не нужна. Аналогично получается, если рабочая область достаточно широка для вывода текста со строкой в 60 знаков, тогда горизонтальная полоса прокрутки не появляется на экране.

НЕ нашли? Не то? Что вы ищете?

В главе 5 вы узнаете, как использовать клавиатуру и как добавить в вашу программу интерфейс клавиатуры. Рекомендуется добавить заранее обработку сообщения WM_VSCROLL, когда младшее слово в wParam равно SB_TOP и SB_BOTTOM. Оконная процедура не получает эти сообщения от полос прокрутки, поэтому для данного случая эти коды излишни. Когда мы в лабораторной работе 5 вернемся к этой программе, вы увидите смысл во включении в программу этих действий.

Для каждого действия с полосой прокрутки сначала рассчитывается приращение ее текущей позиции при обработке сообщений WM_VSCROLL и WM_HSCROLL. Это значение затем используется для прокрутки имеющегося в окне содержимого с помощью вызова функции ScrollWindow. Эта функция имеет

следующий формат:

ScrollWindow(hwnd, xInc, yInc, pRect, pClipRect);

Значения xInc и yInc задают величину прокрутки в пикселях. В SYSMETS3 значения pRect и pClipRect устанавливаются в NULL для указания, что необходимо прокручивать всю рабочую область. Windows делает недействительной прямоугольную зону рабочей области, открываемую операцией прокрутки. Это

приводит к выдаче сообщения WM_PAINT. InvalidateRect больше не нужна. (Отметьте, что функция ScrollWindow не является процедурой GDI, поскольку ей не нужен описатель контекста устройства. Это одна из немногих функций Windows, которая меняет вид рабочей области окна, не являясь функциями GDI.)

Обработчик сообщения WM_PAINT теперь определяет, какие строки находятся внутри недействительного прямоугольника, и выводит только эти строки. Он делает это путем анализа координат верхней и нижней границ недействительного прямоугольника, хранящихся в структуре PAINTSTRUCT. Программа рисует

только те строки текста, которые находятся внутри недействительного прямоугольника. Исходный текст программы более сложен, но она работает гораздо быстрее.

Поскольку сообщения WM_PAINT стали обрабатываться быстрее, теперь, очевидно, есть смысл обрабатывать в SYSMETS3 действия SB_THUMBTRACK для сообщений WM_VSCROLL. Ранее программа игнорировала сообщения SB_THUMBTRACK (которые посылаются, когда пользователь перемещает бегунок полосы прокрутки), а реагировала только на сообщения SB_THUMBPOSITION, которые посылаются, когда пользователь прекращает перемещение бегунка. Сообщение WM_VSCROLL также приводит к вызову функции UpdateWindow для немедленного обновления рабочей области окна. Когда Вы перемещаете бегунок по вертикальной полосе прокрутки, SYSMETS3 непрерывно прокручивает и обновляет рабочую область. Вам самим предлагается решить, насколько быстро работает SYSMETS3 (и Windows), и насколько оправданны внесенные изменения.