Рейтинговые книги
Читем онлайн Графика для Windows средствами DirectDraw - Стэн Трухильо

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 19 20 21 22 23 24 25 26 27 ... 66

private:

 LPDIRECTDRAWSURFACE bmpsurf;

 int x, y;

 int xinc, yinc;

 LPDIRECTDRAWSURFACE menusurf;

 int selectmode;

 LPDIRECTDRAWSURFACE fpssurf;

 RECT fpsrect;

 BOOL displayfps;

 DWORD framecount;

 HFONT smallfont, largefont;

};

Класс SwitchWin содержит всего одну открытую (public) функцию — конструктор класса (вскоре мы его рассмотрим). В классе также присутствует функция OnKeyDown() — обработчик сообщений, созданный ClassWizard (закомментированные директивы AFX, окружающие функцию OnKeyDown(), используются ClassWizard для поиска функций-обработчиков). Мы воспользуемся этой функцией для обработки нажимаемых клавиш — стрелок, Enter и незаменимой клавиши Escape.

Следующие пять функций являются переопределенными версиями функций DirectDrawWin:

• SelectDriver()

• SelectInitialDisplayMode()

• CreateCustomSurfaces()

• DrawScene()

• RestoreSurfaces()

С помощью функции SelectDriver() приложение выбирает используемое видеоустройство (если их несколько). Она полностью совпадает со стандартной версией, создаваемой AppWizard, и выводит меню при наличии нескольких драйверов. Функция SelectInitialDisplayMode() задает исходный видеорежим, устанавливаемый приложением. Здесь снова используется стандартная версия AppWizard, которая ищет видеорежим с параметрами 640x480x16.

Функция CreateCustomSurfaces() вызывается DirectDrawWin при активизации нового видеорежима; мы воспользуемся этой функцией для создания и подготовки поверхностей программы Switch. Функция DrawScene() отвечает за обновление экрана; она будет использоваться для отображения анимации, меню видеорежимов и значения FPS. Наконец, функция RestoreSurfaces() вызывается классом DirectDrawWin при необходимости восстановить потерянные поверхности. Эта функция восстанавливает не только сами поверхности, но и (для особо важных поверхностей) их содержимое.

Затем класс SwitchWin объявляет четыре функции, специфические для программы Switch:

• CreateMenuSurface()

• UpdateMenuSurface()

• CreateFPSSurface()

• UpdateFPSSurface()

Это вспомогательные функции для работы с поверхностями, используемыми для вывода меню видеорежимов и значения FPS. Они подробно рассматриваются ниже в этой главе.

Закрытые переменные, объявленные в конце, предназначены для отображения анимации, меню видеорежимов и FPS, а также для работы со шрифтами средствами Win32.

Переменная bmpsurf — указатель на интерфейс DirectDrawSurface, через который мы будем обращаться к данным перемещаемого растра, а переменные x, y, xinc и yinc определяют его положение.

Указатель menusurf используется для доступа к поверхности меню видеорежимов, а в целой переменной selectmode хранится индекс текущего активного видеорежима.

Следующие переменные списка связаны с выводом значения FPS. Переменная fpssurf — указатель на интерфейс DirectDrawSurface, через который производится доступ к поверхности FPS. Структура типа RECT (fpsrect) содержит размеры поверхности fpssurf. Логическая переменная displayfps управляет отображением значения FPS, а в переменной framecount хранится количество кадров, выведенных в очередном временном интервале измерения FPS.

Две последние переменные, smallfont и largefont, имеют тип HFONT. Это логические номера шрифтов Win32, используемые для вывода текста на поверхностях menusurf и fpssurf.

Инициализация приложения

Наше знакомство с программой Switch начинается с конструктора switchWin, внутри которого происходит первоначальная инициализация переменных класса. Не следует путать эту инициализацию с той, что выполняется функцией CreateCustomSurfaces(), потому что в отличие конструктора CreateCustomSurfaces() вызывается при каждой смене видеорежима. Конструктор выглядит так

SwitchWin::SwitchWin(){

 bmpsurf=0;

 x=y=0;

 xinc=8;

 yinc=1;

 menusurf=0;

 fpssurf=0;

 vlargefont = CreateFont(28, 0, 0, 0,    FW_NORMAL, FALSE, FALSE, FALSE,   ANSI_CHARSET,    OUT_DEFAULT_PRECIS,   CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,   VARIABLE_PITCH,    "Arial");

 smallfont = CreateFont(14, 0, 0, 0,    FW_NORMAL, FALSE, FALSE, FALSE,   ANSI_CHARSET,    OUT_DEFAULT_PRECIS,   CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,   VARIABLE_PITCH,    "Arial");

}

В основном конструктор просто обнуляет переменные. Два логических номера шрифтов инициализируются функцией Win32 CreateFont(). В программе используются два разных размера одного и того же шрифта: крупным шрифтом выводится заголовок на поверхности меню видеорежимов, а мелким — описания видеорежимов и текст со значением FPS.

После того как объект 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 failedn");

  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() failedn");

 DDCOLORKEY ddck;

 ddck.dwColorSpaceLowValue = 0;

 ddck.dwColorSpaceHighValue = 0;

 menusurf->SetColorKey(DDCKEY_SRCBLT, &ddck);

 return TRUE;

}

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

Если вы не знаете, для чего нужны цветовые ключи, попробуйте запустить программу Switch и понаблюдать за поведением меню видеорежимов. Обратите внимание — когда перемещающийся растр оказывается в верхней части экрана, он проходит как бы позади меню, но при этом остается видимым. Текст меню непрозрачен, однако те части меню, в которых текста нет, прозрачны. Дело в том, что пиксели пустых участков меню не выводятся DirectDraw и потому не заслоняют растр. Цветовой ключ определяет, какие именно пиксели поверхности не будут выводиться.

Мы назначаем цветовой ключ поверхности меню с помощью структуры DDCOLORKEY и функции SetColorKey(). Оба поля DDCOLORKEY обнуляются (некоторые видеокарты позволяют задавать интервалы цветовых ключей, но в нашем случае используется всего один цвет). Это означает, что пиксели поверхности, равные нулю, не будут копироваться при блит-операциях с активным цветовым ключом.

После того как поверхность меню будет создана функцией CreateMenuSurface(), она заполняется с помощью функции UpdateMenuSurface(). Внутри последней для вывода текста на поверхность используются функция GetDC() интерфейса DirectDrawSurface и текстовые функции Win32. Функция UpdateMenuSurface() приведена в листинге 4.3.

Листинг 4.3. Функция SwitchWin::UpdateMenuSurface()

BOOL SwitchWin::UpdateMenuSurface() {

 char buf[40];

 int len;

 int hdrlen=strlen(headertext);

 ClearSurface(menusurf, 0);

 HDC hdc;

 menusurf->GetDC(&hdc);

 SelectObject(hdc, largefont);

 SetBkMode(hdc, TRANSPARENT);

1 ... 19 20 21 22 23 24 25 26 27 ... 66
На этой странице вы можете бесплатно читать книгу Графика для Windows средствами DirectDraw - Стэн Трухильо бесплатно.
Похожие на Графика для Windows средствами DirectDraw - Стэн Трухильо книги

Оставить комментарий