Графика для Windows средствами DirectDraw | страница 70
>ddraw->EnumDisplayModes(0, 0, this, DisplayModeAvailable);
Первый и второй аргументы равны нулю; это означает, что мы не указываем флаги и критерии видеорежимов. Поскольку флаги (первый аргумент) не указаны, каждый обнаруженный видеорежим включается в список один и только один раз. Если бы в первом аргументе был указан флаг DDEDM_REFRESHRATES, каждый видеорежим вошел бы в список столько раз, сколько различных частот смены кадров в нем поддерживается. Такая возможность рассматривается ниже в этой главе при работе с частотами смены кадров в программе SuperSwitch.
Как было сказано в начале главы, смена видеорежима не сводится к вызову функции 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