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



После того как объект SwitchWin будет создан, DirectDrawWin вызывает функции SelectDriver() и SelectInitialDisplayMode(). Поскольку в программе Switch обе функции ведут себя стандартным образом (как описано в главе 3), мы не будем их рассматривать.

Затем класс DirectDrawWin вызывает функцию SwitchWin::CreateCustomSurfaces(), в которой подготавливает три поверхности, используемые программой Switch:

>BOOL SwitchWin::CreateCustomSurfaces() {

> int displaydepth=GetCurDisplayDepth();

> CString filename;

> if (displaydepth==8) filename="tri08.bmp";

> else filename="tri24.bmp";

> bmpsurf=CreateSurface(filename, TRUE);

> if (bmpsurf==0) {

>  TRACE("surface creation failed\n");

>  return FALSE;

> }

> selectmode=GetCurDisplayMode();

> CreateMenuSurface();

> UpdateMenuSurface();

> CreateFPSSurface();

> return TRUE;

>}

Содержимое одной из этих трех поверхностей определяется BMP-файлом. Функция CreateCustomSurfaces() по текущей глубине пикселей определяет, какой из двух BMP-файлов нужно использовать. Затем указатель на поверхность (bmpsurf) инициализируется функцией DirectDrawWin::CreateSurface(). В случае 8-битного видеорежима содержимое палитры DirectDraw определяется палитрой из BMP-файла.

Затем происходит инициализация самой поверхности и переменных, связанных с видеорежимом. Переменной selectmode присваивается значение, зависящее от текущего видеорежима. Это значение используется для выделения активного видеорежима в меню. Указатель на поверхность меню видеорежимов (menusurf) инициализируется вызовами функций CreateMenuSurface() и UpdateMenuSurface().

Наконец, переменные поверхности FPS инициализируются функцией Create FPSSurface(). Мы рассмотрим ее позднее, после функций CreateMenuSurface() и UpdateMenuSurface().

Функция CreateMenuSurface() выглядит так:

>BOOL SwitchWin::CreateMenuSurface() {

> if (menusurf) menusurf->Release(), menusurf=0;

> menusurf=CreateSurface(menuwidth, menuheight);

> if (menusurf==0) Fatal("SwitchWin::CreateMenuSurface() failed\n");

> DDCOLORKEY ddck;

> ddck.dwColorSpaceLowValue = 0;

> ddck.dwColorSpaceHighValue = 0;

> menusurf->SetColorKey(DDCKEY_SRCBLT, &ddck);

> return TRUE;

>}

Прежде всего CreateMenuSurface() освобождает любые поверхности, созданные ранее. Новая поверхность создается функцией CreateSurface(). Доступ к ней осуществляется через переменную menusurf. Затем мы назначаем новой поверхности цветовой ключ с помощью структуры DDCOLORKEY и функции SetColorKey() интерфейса DirectDrawSurface