Класс SwitchWin
Давайте рассмотрим код программы Switch. Начнем с определения класса SwitchWin(см. листинг 4.2).
Листинг 4.2. Объявление класса SwitchWin
class SwitchWin : public DirectDrawWin {
public:
SwitchWin();
protected:
//{{AFX_MSG(SwitchWin)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int SelectDriver();
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces();
void DrawScene();
void RestoreSurfaces();
BOOL CreateMenuSurface();
BOOL UpdateMenuSurface();
BOOL CreateFPSSurface();
BOOL UpdateFPSSurface();
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(){
Читать дальше