Графика для 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