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



с описанием необходимых атрибутов видеорежимов. Третий аргумент может использоваться для передачи данных косвенно вызываемой функции при каждом обращении к ней, а четвертый — является указателем на эту функцию. В главе 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