Трухильо Стэн
Шрифт:
Как было сказано в начале главы, смена видеорежима не сводится к вызову функции SetDisplayMode. Функция SetDisplayMode активизирует нужный режим, но при этом необходимо уничтожить существующие поверхности и создать их заново. Класс DirectDrawWin решает эту задачу за вас. В него входит функция ActivateDisplayMode, выполняющая все действия, необходимые для активизации видеорежима и восстановления поверхностей приложения. Для удобства давайте снова посмотрим, как выглядит функция ActivateDisplayMode (см. листинг 4.1).
Листинг 4.1. Функция DirectDrawWin::ActivateDisplayMode
Функция ActivateDisplayMode получает один аргумент — индекс в отсортированном списке обнаруженных видеорежимов. Сначала индекс проверяется на правильность. Если он соответствует допустимому элементу массива displaymode, высота, ширина и глубина заданного режима извлекаются из массива и используются для инициализации переменных displayrect и displaydepth. Затем атрибуты видеорежима используются при вызове функции SetDisplayMode, активизирующей новый видеорежим.
Далее функция CreateFlipingSurfaces создает первичную поверхность со вторичным буфером, а функция StorePixelFormatData проверяет, не устарел ли формат пикселей DirectDrawWin (форматы пикселей подробно рассматриваются в главе 5). Наконец, мы вызываем функцию CreateCustomSurfaces, отвечающую за создание вспомогательных поверхностей приложения.
Итак, функция ActivateDisplayMode автоматизирует процесс переключения видеорежимов. Сначала она проверяет, будут ли при вызове функции SetDisplayMode использоваться правильные аргументы, а затем восстанавливает поверхности приложения. Настало время применить ее на практике.
Программа Switch — полноэкранное приложение DirectDraw, которое выводит меню всех поддерживаемых видеорежимов и позволяет активизировать любой из них. На рис. 4.1 показано, как она выглядит.
Рис. 4.1. Программа Switch
Эта программа представляет собой модифицированное полноэкранное приложение, сгенерированное DirectDraw AppWizard. В программу было добавлено меню, позволяющее выбрать видеорежим (с помощью клавиш со стрелками) и активизировать его (клавишей Enter). Клавиша Escape завершает работу программы. Программа Switch также вычисляет и отображает FPS приложения (количество кадров в секунду).
В программе Switch мы научимся:
• переключать видеорежимы;
• выводить текст на поверхностях DirectDraw;
• рассчитывать FPS приложения;
• работать с цветовыми ключами.
Программа Switch, как и все остальные программы в этой книге, была создана с помощью DirectDraw AppWizard, так что ее структура покажется вам знакомой, если вы прочитали главу 3. Реализация программы основана на двух классах, SwitchWin и SwitchApp, производных от классов DirectDrawWin и DirectDrawApp соответственно. Класс SwitchApp остался в том виде, в котором он был сгенерирован AppWizard, и потому дальнейшему обсуждению не подлежит.
Класс SwitchWin создает три поверхности: одна используется для перемещения растрового изображения на экране, вторая реализует меню видеорежимов, а третья — вывод FPS. Но перед тем, как рассматривать код программы, давайте поговорим о том, как вывести на поверхность текст и как рассчитать FPS приложения.
Самый простой способ вывести текст на поверхность — получить у Windows DC (контекст устройства) с помощью функции GetDC интерфейса DirectDrawSurface. После этого можно вывести текст на поверхность стандартными функциями TextOut и TextOutExt и освободить DC функцией DirectDrawSurface::ReleaseDC. Атрибуты текста (цвет, фон и способ вывода) выбираются следующими функциями Win32: