• SetDisplayMode()
С помощью функции EnumDisplayModes()можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes()перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes()не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640×480×8.
Функция SetDisplayMode()активизирует заданный видеорежим. Версия SetDisplay Mode()из интерфейса DirectDraw2позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisplayMode()присутствует в любой программе, осуществляющей переключение видеорежимов.
Функция RestoreDisplayMode()восстанавливает видеорежим, действовавший до вызова SetDisplayMode(). Перед вызовом функций SetDisplayMode()и RestoreDisplayMode()необходимо предварительно установить монопольный уровень кооперации вызовом функции SetCooperativeLevel().
Функции для работы с поверхностями
Помимо функции CreateSurface()интерфейс DirectDrawсодержит следующие функции для работы с поверхностями:
• DuplicateSurface()
• EnumSurfaces()
• FlipToGDISurface()
• GetGDISurface()
• GetAvailableVidMem()
• Compact()
Функция DuplicateSurface()создает копию существующей поверхности. Она копирует только интерфейс поверхности, но не ее содержимое. Копия поверхности использует ту же область памяти, поэтому модификация содержимого памяти приведет к изменению изображения, представленного обеими поверхностями.
Функция EnumSurfaces()используется для перебора всех поверхностей, удовлетворяющих заданному критерию. Если критерий не указан, составляется список всех существующих поверхностей.
Функция FlipToGDISurface()используется перед завершением приложения, осуществляющего переключение страниц, чтобы обеспечить правильное восстановление первичной поверхности. Вспомните о том, что при переключении страниц происходит попеременное отображение двух поверхностей. Это означает, что приложение может завершиться, не восстановив исходной поверхности, отображаемой на экране. Если это произойдет, Windows будет осуществлять вывод на невидимую поверхность. Такой ситуации можно легко избежать с помощью функции FlipToGDISurface().
Функция GetGDISurface()возвращает указатель на единственную поверхность, с которой работает GDI. Весь графический вывод Windows осуществляется именно на поверхность GDI. Примером ситуации, когда эта функция может оказаться полезной, является программа копирования экрана, в которой DirectDraw используется для копирования произвольной части рабочего стола.
Функция GetAvailableVidMem()возвращает объем текущей доступной видеопамяти. Эта функция присутствует в интерфейсе DirectDraw2, но отсутствует в DirectDraw. С ее помощью приложение может определить, сколько поверхностей ваше приложение сможет создать в видеопамяти.
Функция Compact()не реализована в DirectX, однако в будущем она обеспечит механизм дефрагментации видеопамяти. Если ваше приложение постоянно создает и уничтожает поверхности, находящиеся в видеопамяти, дефрагментация может высвободить немало места.
Функции для работы с частотой смены кадров
Интерфейс DirectDrawсодержит четыре функции, относящихся не к видеокарте, а к устройству отображения (монитору):
• GetMonitorFrequency()
• GetScanLine()
• GetVerticalBlankStatus()
• WaitForVerticalBlank()
Говоря конкретно, эти функции относятся к механизму смены кадров на мониторе. С их помощью можно реализовать анимации с минимальным мерцанием и задержками. Тем не менее следует учесть, что эти функции поддерживаются не всеми комбинациями видеокарт и мониторов.
Функция GetMonitorFrequency()возвращает текущую частоту смены кадров монитора. Эта частота обычно измеряется в герцах (Гц). Например, частота в 60 Гц означает, что состояние экрана обновляется 60 раз в секунду.
Функция GetScanLine()возвращает номер строки развертки (горизонтального ряда пикселей), обновляемой в данный момент. Она не поддерживается некоторыми комбинациями видеокарт и мониторов. Если данная способность не поддерживается, функция возвращает код ошибки DDERR_UNSUPPORTED.
Читать дальше