Графика для Windows средствами DirectDraw
Шрифт:
Затем происходит инициализация самой поверхности и переменных, связанных с видеорежимом. Переменной selectmode присваивается значение, зависящее от текущего видеорежима. Это значение используется для выделения активного видеорежима в меню. Указатель на поверхность меню видеорежимов (menusurf) инициализируется вызовами функций CreateMenuSurface и UpdateMenuSurface.
Наконец, переменные поверхности FPS инициализируются функцией Create FPSSurface. Мы рассмотрим ее позднее, после функций CreateMenuSurface и UpdateMenuSurface.
Функция CreateMenuSurface
Прежде всего CreateMenuSurface освобождает любые поверхности, созданные ранее. Новая поверхность создается функцией CreateSurface. Доступ к ней осуществляется через переменную menusurf. Затем мы назначаем новой поверхности цветовой ключ с помощью структуры DDCOLORKEY и функции SetColorKey интерфейса DirectDrawSurface.
Если вы не знаете, для чего нужны цветовые ключи, попробуйте запустить программу Switch и понаблюдать за поведением меню видеорежимов. Обратите внимание — когда перемещающийся растр оказывается в верхней части экрана, он проходит как бы позади меню, но при этом остается видимым. Текст меню непрозрачен, однако те части меню, в которых текста нет, прозрачны. Дело в том, что пиксели пустых участков меню не выводятся DirectDraw и потому не заслоняют растр. Цветовой ключ определяет, какие именно пиксели поверхности не будут выводиться.
Мы назначаем цветовой ключ поверхности меню с помощью структуры DDCOLORKEY и функции SetColorKey. Оба поля DDCOLORKEY обнуляются (некоторые видеокарты позволяют задавать интервалы цветовых ключей, но в нашем случае используется всего один цвет). Это означает, что пиксели поверхности, равные нулю, не будут копироваться при блит-операциях с активным цветовым ключом.
После того как поверхность меню будет создана функцией CreateMenuSurface, она заполняется с помощью функции UpdateMenuSurface. Внутри последней для вывода текста на поверхность используются функция GetDC интерфейса DirectDrawSurface и текстовые функции Win32. Функция UpdateMenuSurface приведена в листинге 4.3.
Листинг 4.3. Функция SwitchWin::UpdateMenuSurface
Функция UpdateMenuSurface
Теперь все готово к выводу текста. Обратите внимание на функцию SetBkMode, которая указывает, что текст должен выводиться в прозрачном режиме. Это значит, что функция TextOut будет выводить только сам текст, без фона, благодаря чему наш прозрачный фон останется в неприкосновенности. Цвет текста задается функцией Win32 SetTextColor. В этой программе используются три цвета: первый — для обычного текста, второй — для затененного текста, и третий — для текста, выделенного подсветкой. Каждая текстовая строка выводится дважды — сначала затемненным, а потом обычным цветом; затененный текст смещен на один пиксель по отношению к обычному. После завершения вывода текста вызывается функция ReleaseDC интерфейса DirectDrawSurface.
Инициализация приложения завершается вызовом функции CreateFPSSurface, которая создает поверхность для вывода FPS. Она выглядит так: