Прототип к варианту 16 - МикроГраф, страница 2

Одно из важных, хотя и неочевидных отличий Win 16 от Win32 состоит в том, что большинство функций Win32 API обладает возвращаемым значением, тогда как эквивалентные функции Winl6 значений не возвращали. Чтобы свести к минимуму изменения в программе, в данном случае оказалось проще заменить в объявлениях Win 16 ключевое слово Sub на Function. Поскольку числовые возвращаемые значения передаются в регистрах, а не в стеке (см. главу 3), такая замена не влияет на конвенцию вызова. Если программа игнорирует возвращаемые значения (по крайней мере, в Win 16), замена не отразится на ее работе.

Листинг 8.5. Секция объявлений QUIKDRAW.BAS

Структура RECTS необходима из-за того, что в стандартных метафайлах Windows используются 16-разрядные прямоугольники, а форматы файлов не изменились при переходе от WinlS к Win32.

Некоторые константы, входящие в файл, были исключены из листинга для экономии места. К их числу относятся константы с префиксами OBJ_, R2_, PS_, MM_ и HS_.

Глобальные переменные приложения

Обработчик события ScrollObject_Change выбирает перо и кисть в зависимости от состояния полос прокрутки. Затем он обновляет объект Pictures, в котором рисуется прямоугольник с применением текущей кисти и пера. Обратите внимание на то, как перед созданием нового пера и кисти функция удаляет предыдущее перо и кисть.

Полосы прокрутки используются для выбора цвета и стиля кисти и пера, а также толщины пера. Свойства Min и Мах выбираются так, чтобы свойство Value полосы прокрутки можно было непосредственно использовать при вызове функции GDI, создающей объект.

Обработчик события Picture3_Paint вычисляет размеры рисуемого прямоугольника на основании фактических размеров элемента. Сначала прямоугольник заполняется размерами элемента, полученными функцией GetClientRect. Затем прямоугольник сжимается функцией InflateRect.

Как обычно, функция восстанавливает исходные объекты в контексте устройства.

В графическом поле Pictures рисуется прямоугольник  с применением текущего пера и кисти.

При щелчке мышью в графическом поле Picturel внутренний массив точек обновляется в соответствии с координатами щелчка. Положение точек обозначается небольшим маркером +.

Три кнопки объединены в массив элементов. Кнопка 0 просто рисует объект, выбранный в меню Draw. Кнопка 1 рисует,в поле PictureZ, показывая, как выполняется масштабирование. Кнопка 2 добавляет фигуру в текущий метафайл.

В любом случае работа начинается с настройки системы координат. При выводе в Picturel остается режим отображения ММ_ТЕХТ, поскольку все координаты точек совпадают с физическими координатами элемента. Для вывода в PictureZ, малом графическом поле, изображение необходимо масштабировать. Габаритам логического окна присваиваются размеры элемента Picturel, поскольку все координаты точек заданы для этого элемента. Габаритам области просмотра присваиваются размеры элемента Picture2 в физических координатах. Для вывода в метафайл ни габариты, ни область просмотра не задаются — происходит обычная запись команд GDI. He существует простых средств для добавления команд в метафайл, поэтому мы создаем новый метафайл, затем воспроизводим предыдущий метафайл в контексте устройства нового метафайла и удаляем исходный метафайл.

Используемый контекст устройства сохраняется в переменной dc. Для последующих графических команд совершенно неважно, на каком устройстве они рисуют.