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