Чтение онлайн

на главную

Жанры

Графика для Windows средствами DirectDraw

Трухильо Стэн

Шрифт:

Функция SetDisplayMode, как и большинство функций DirectX API, возвращает значение типа HRESULT — 32-разрядную величину с описанием результата вызова функции. Ее значение DD_OK показывает, что вызов оказался успешным.

Версия SetDisplayMode из интерфейса DirectDraw получает три аргумента типа DWORD. Эти аргументы определяют разрешение экрана и глубину пикселей нужного видеорежима, поэтому стандартный видеорежим VGA 640×480×8 активизируется так:

ddraw1->SetDisplayMode(640, 480, 8);

Выглядит

довольно просто, поэтому давайте перейдем к версии SetDisplayMode из интерфейса DirectDraw2. Ее традиционный прототип выглядит так:

HRESULT SetDisplayMode(DWORD width, DWORD height, DWORD depth, DWORD refreshrate, DWORD flags);

В этой версии появляются два дополнительных аргумента: частота смены кадров и двойное слово, которое может быть использовано в будущих версиях DirectDraw, а пока должно быть равно нулю. В расширенной версии SetDisplayMode стандартный видеорежим VGA 640×480×8 можно активизировать так:

ddraw1->SetDisplayMode(640, 480, 8, 0, 0);

В данном случае вместо частоты смены кадров передается 0; это означает, что должна быть использована частота, принятая по умолчанию. Кроме того, можно указать конкретное значение частоты (60 Гц в следующем примере):

ddraw1->SetDisplayMode(640, 480, 8, 60, 0);

Однако не следует думать, что вы можете задать любую частоту (или другие параметры видеорежима). Перед тем как вызывать SetDisplayMode, необходимо сначала определить параметры и частоты допустимых видеорежимов.

Обнаружение видеорежимов и частот смены кадров

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

HRESULT EnumDisplayModes(DWORD flags, LPDDSURFACEDESC desc, LPVOID callbackdata, LPDDENUMMODESCALLBACK callback);

Первый аргумент EnumDisplayModes представляет собой набор флагов для описания дополнительных возможностей. Второй — является указателем на структуру DDSURFACEDESC с описанием необходимых атрибутов видеорежимов. Третий аргумент может использоваться для передачи данных косвенно вызываемой функции при каждом обращении к ней, а четвертый — является указателем на эту функцию. В главе 3 вызов EnumDisplayModes выглядел так:

ddraw->EnumDisplayModes(0, 0, this, DisplayModeAvailable);

Первый и второй аргументы равны нулю; это означает, что мы не указываем флаги и критерии видеорежимов. Поскольку флаги (первый аргумент) не указаны, каждый обнаруженный видеорежим включается в список один и только один раз. Если бы в первом аргументе был указан флаг DDEDM_REFRESHRATES, каждый видеорежим вошел бы в список столько раз,

сколько различных частот смены кадров в нем поддерживается. Такая возможность рассматривается ниже в этой главе при работе с частотами смены кадров в программе SuperSwitch.

Функция ActivateDisplayMode

Как было сказано в начале главы, смена видеорежима не сводится к вызову функции SetDisplayMode. Функция SetDisplayMode активизирует нужный режим, но при этом необходимо уничтожить существующие поверхности и создать их заново. Класс DirectDrawWin решает эту задачу за вас. В него входит функция ActivateDisplayMode, выполняющая все действия, необходимые для активизации видеорежима и восстановления поверхностей приложения. Для удобства давайте снова посмотрим, как выглядит функция ActivateDisplayMode (см. листинг 4.1).

Листинг 4.1. Функция DirectDrawWin::ActivateDisplayMode

BOOL DirectDrawWin::ActivateDisplayMode(int mode) {

 if (mode<0 || mode>=totaldisplaymodes) return FALSE;

 DWORD width = displaymode[mode].width;

 DWORD height = displaymode[mode].height;

 DWORD depth = displaymode[mode].depth;

 displayrect.left=0;

 displayrect.top=0;

 displayrect.right=width;

 displayrect.bottom=height;

 displaydepth=depth;

 ddraw2->SetDisplayMode(width, height, depth, rate, 0);

 curdisplaymode = mode;

 TRACE("------------------- %dx%dx%d (%dhz) ---------------\n", width, height, depth, rate);

 if (CreateFlippingSurfaces==FALSE) {

FatalError("CreateFlippingSurfaces failed");

return FALSE;

 }

 StorePixelFormatData;

 if (CreateCustomSurfaces==FALSE) {

FatalError("CreateCustomSurfaces failed");

return FALSE;

 }

 return TRUE;

}

Функция ActivateDisplayMode получает один аргумент — индекс в отсортированном списке обнаруженных видеорежимов. Сначала индекс проверяется на правильность. Если он соответствует допустимому элементу массива displaymode, высота, ширина и глубина заданного режима извлекаются из массива и используются для инициализации переменных displayrect и displaydepth. Затем атрибуты видеорежима используются при вызове функции SetDisplayMode, активизирующей новый видеорежим.

Популярные книги

Аромат невинности

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
эро литература
9.23
рейтинг книги
Аромат невинности

Неправильный лекарь. Том 1

Измайлов Сергей
1. Неправильный лекарь
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неправильный лекарь. Том 1

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Под маской, или Страшилка в академии магии

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.78
рейтинг книги
Под маской, или Страшилка в академии магии

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Повелитель механического легиона. Том VI

Лисицин Евгений
6. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VI

Спасите меня, Кацураги-сан! Том 4

Аржанов Алексей
4. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 4

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Часограмма

Щерба Наталья Васильевна
5. Часодеи
Детские:
детская фантастика
9.43
рейтинг книги
Часограмма

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Демон

Парсиев Дмитрий
2. История одного эволюционера
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Демон

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок