Графика для Windows средствами DirectDraw | страница 50
В C++ чисто виртуальные функции обязательно должны переопределяться, в противном случае класс не будет компилироваться. Однако со стороны DirectDrawWin было бы нечестно требовать от производного класса выбора исходного видеорежима, не предоставляя ему средств для просмотра возможных вариантов (переменные класса, в которых хранятся сведения о видеорежимах, являются закрытыми (private)). Для этой цели в классе DirectDrawWin предусмотрены функции GetNumDisplayModes() и GetDisplayModeDimensions(). В версии SelectInitialDisplayMode() класса BounceWin эти функции используются для выбора исходного режима:
>int BounceWin::SelectInitialDisplayMode() {
> int i, nummodes=GetNumDisplayModes();
> DWORD w,h,d;
> for (i=0;i
> GetDisplayModeDimensions(i, w, h, d);
> if (w==desiredwidth && h==desiredheight && d==desireddepth) return i;
> }
> for (i=0;i>nummodes;i++) {
> GetDisplayModeDimensions(i, w, h, d);
> if (d==desireddepth) return i;
> }
> return 0;
>}
Функция сначала определяет количество режимов функцией GetNumDisplayModes(), а затем в цикле пытается найти видеорежим с заданным разрешением и глубиной пикселей. Атрибуты каждого видеорежима извлекаются функцией GetDisplayModeDimensions(); если совпадение будет найдено, возвращается индекс видеорежима. В противном случае другой цикл ищет любой видеорежим с заданной глубиной пикселей. Поскольку цикл начинается с начала массива displaymode, с большей вероятностью будут выбираться режимы низкого разрешения. Если не найдено ни одного видеорежима с заданной глубиной пикселей, возвращается значение 0 — оно говорит о том, что следует использовать видеорежим с минимальным разрешением. Код возврата –1 сообщает DirectDrawWin о том, что ни один приемлемый видеорежим так и не был найден и работу приложения следует завершить.
На предпоследнем этапе происходит активизация выбранного режима. Для этого используется функция ActivateDisplayMode(), которая на самом деле выполняет и задачу последнего этапа (создание поверхностей приложения). Код этой функции приведен в листинге 3.2.
Листинг 3.2. Функция 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;