Прототип к варианту 18 - Графическая головоломка

Страницы работы

Содержание работы

Прототип к варианту 18 - Графическая головоломка

Программа ROPTest позволяет поэкспериментировать с различными растровыми операциями. На рис. 9.11 показано рабочее окно программы ROPTest.

Использование ROPTest

Основными элементами окна ROPTest являются два графических поля. Левое поле picSource заполняется цветными полосками, изображающими 16 стандартных элементов палитры. Если щелкнуть на любой полоске, ее цвет используется для выбора текущей кисти, которая заполняет графическое поле picBrush. Правое графическое поле, picDest, представляет собой приемник для графических операций. Растровые операции выбираются двумя способами. Вы можете установить переключатель в нужное положение или же ввести числовой код операции в текстовом поле. Программа работает в двух режимах: PatBIt и BitBIt При нажатии кнопки PatBIt выполняется заданная растровая операция, хотя эта кнопка и не действует для растровых операций с участием параметра-источника. Кнопка BitBIt выполняет заданную операцию, объединяя источник, узорную кисть и приемник.

Описание проекта

Программа ROPTest содержит всего одну форму ROPTEST.FRM, приведенную в листинге 9.3. Листинг 9.3. ROPTEST.FRM

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

Использование Puzzle

Работать с приложением Puzzle очень просто. При загрузке программы в окне выводится стандартный растр (рисунок «арки» из поставки Windows). Один из квадратов сетки 5x5 закрашивается черным цветом; этот квадрат считается пустым. Если щелкнуть мышью на любой плитке, прилегающей к пустому квадрату, эта плитка перемещается на пустое место. Цель игры — восстановить исходное изображение.

Меню состоит из трех команд. Команда Scramble переставляет плитки изображения в случайном порядке. Команда Load вызывает форму для выбора нового файла растрового изображения. Выбранный растр масштабируется таким образом, чтобы он заполнял все окно приложения. Команда Empty позволяет выбрать внешний вид пустого квадрата. Он может закрашиваться черным цветом (по умолчанию), белым цветом или случайным узором.

На рис. 9.12 показана форма приложения Puzzle в режиме конструирования. На рис. 9.13 эта же форма изображена во время работы.

Описание проекта

Проект Puzzle состоит из четырех файлов. PUZZLE.FRM — главная форма приложения, используемая программой. Форма PUZZLE2. FRM используется при загрузке новых растров, это довольно типичное диалоговое окно для выбора файла. Единственный модуль программы, PUZZLE.BAS, содержит определения констант и функций. Файл APIGID32.BAS содержит объявления функций библиотеки динамической компоновки APIGID32.DLL.

В листинге 9.4 приведен заголовок файла PUZZLE.FRM, описывающий расположение элементов на форме. Слева расположено графическое поле Picturel, а справа — Picture2. Расположение и размеры этих полей несущественны, поскольку программа сама масштабирует их так, как потребуется.

Листинг 9.4. PUZZLE.FRM

Файл PUZZLE.FRX содержит изображение, по умолчанию используемое в головоломке, — в данном случае это файл ARCHES.BMP из поставки Microsoft Windows. При желании можно удалить из листинга строку Picture = Puzzle.FRX:000Q

Если вы это сделаете, откройте форму в режиме конструирования и поместите в поле PictureZ растр по своему выбору.

В листинге 9.5 приведен заголовок файла PUZZLE2.FRM, описывающий расположение элементов на форме. Это типичное диалоговое окно для выбора загружаемых файлов. Если щелкнуть на имени растрового файла в списке, можно просмотреть внешний вид загружаемого файла.

Листинг 9.5. PUZZLE2.FRM

Существует много способов масштабирования элементов в форме. Метод, продемонстрированный ниже, представляет собой один из окольных путей (по данным клиентского прямоугольника). Но поскольку нам все равно придется инициализировать переменную PuzzleRect, будет нелишне заодно продемонстрировать преобразование пикселов в твипы.

Функция CreateEmptyBrush является одной из самых важных функций в этой книге и потому заслуживает более пристального внимания. В начале своей работы функция создает аппаратно-независимый растр. DIB не является объектом GDI — другими словами, с ним не связывается манипулятор. DIB просто представляет собой набор структур данных в памяти, удовлетворяющих спецификации аппаратно-независимых растров. В большинстве функций DIB делится на две части. Заголовок (структура данных BITMAPINFOHEADER) содержит описание DIB и цветовую таблицу. Графические данные хранятся в отдельном массиве.

Чтобы создать DIB, CreateEmptyBrush определяет структуру BITMAPINFOHEADER и инициализирует ее нужными значениями. Структура копируется в BUMAPINFO вместе со цветовой таблицей. Наконец, отдельный блок памяти (байтовый массив da) заполняется данными растра — в нашем примере случайным узором.

На этом построение DIB закончено. DIB состоит из структуры Ы, содержащей заголовок, и массива da с графическими данными.

В отличие от DIB обычные (аппаратно-зависимые) растры являются объектами GDI и потому обладают манипуляторами. Аппаратно-зависимый растр легко создается на основе DIB функцией CreateDIBitmap (см. ниже), и этот растр, в свою очередь, может использоваться для создания кисти.

Продемонстрированные здесь принципы могут применяться к всем операциям с DIB и растровыми изображениями. Кроме того, аппаратно-независимые растры широко используются в приложении PicPrint главы 12.

Функция UpdateOne производит непосредственный графический вывод. Она показывает, как использовать функцию StretchBIt для копирования одной части изображения в другую с перемещением и растяжением.

Рекомендации для самостоятельной работы

Приложение Puzzle можно улучшить несколькими способами. Ниже перечислены лишь некоторые рекомендации, которыми вы можете воспользоваться:

-организуйте автоматическое обнаружение правильно собранной головоломки (подсказка: выигрышную ситуацию можно определить по содержимому массива Position);

-добавьте линии, отмечающие границы плиток. Какая бинарная растровая операция (ROP2) позволит добиться наилучшего эффекта?

-создайте форму для редактирования растра 8x8, на основе которого создается узорная кисть (вместо случайных данных, используемых в примере);

-проверьте, работает ли программа в Windows NT. Если проверка даст положительный результат, организуйте поддержку узора кисти больше 8x8 пикселов.

Похожие материалы

Информация о работе