Рис. 4.2. Программа SuperSwitch
Отличия начинаются с того, что классы в этой программе называются SuperSwitchWinи SuperSwitchApp(вместо SwitchWinи SwitchApp). Класс SuperSwitchWinпохож на SwitchWin, но в нем имеется несколько новых функций и переменных. Давайте посмотрим, что же изменилось. Объявление класса SuperSwitchWinприведено в листинге 4.6.
Листинг 4.6. Объявление класса SuperSwitchWin
class SuperSwitchWin : public DirectDrawWin {
public:
SuperSwitchWin();
protected:
//{{AFX_MSG(SuperSwitchWin)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int SelectDriver();
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces();
static HRESULT WINAPI StoreModeInfo(LPDDSURFACEDESC, LPVOID);
void DrawScene();
void RestoreSurfaces();
BOOL CreateModeMenuSurface();
BOOL UpdateModeMenuSurface();
BOOL CreateRateMenuSurface();
BOOL UpdateRateMenuSurface();
BOOL CreateFPSSurface();
BOOL UpdateFPSSurface();
private:
LPDIRECTDRAWSURFACE bmpsurf;
int x,y;
int xinc, yinc;
LPDIRECTDRAWSURFACE modemenusurf;
int selectmode;
LPDIRECTDRAWSURFACE ratemenusurf;
int selectrate;
int numrates;
BOOL ratemenu_up;
LPDIRECTDRAWSURFACE fpssurf;
RECT fpsrect;
BOOL displayfps;
DWORD framecount;
BOOL include_refresh;
CArray refresh_rates[MAXDISPLAYMODES];
HFONT smallfont, largefont;
};
Отличия начинаются с функции OnCreate(). Мы переопределяем функцию DirectDrawWin::OnCreate()так, чтобы перед инициализацией DirectDraw в ней выводилось диалоговое окно (в котором можно отключить изменение частоты смены кадров).
Другая новая функция — StoreModeInfo(). Эта функция косвенного вызова вызывается при составлении списка частот каждого видеорежима. Как говорилось в главе 3, класс DirectDrawWinимеет для этой цели собственную функцию косвенного вызова ( DisplayModeAvailable()). Вместо того чтобы изменять класс DirectDrawWin, мы воспользуемся функцией StoreModeInfo(), приспособленной для целей конкретного приложения. Это означает, что список видеорежимов будет составляться дважды: сначала без частот смены кадров (класс DirectDrawWin), а потом с частотами (класс SuperSwitchWin).
Далее в списке идут четыре новые функции:
• CreateModeMenuSurface()
• UpdateModeMenuSurface()
• CreateRateMenuSurface()
• UpdateRateMenuSurface()
Функции CreateModeMenuSurface()и UpdateModeMenuSurface() — это просто переименованные функции CreateMenuSurface()и UpdateMenuSurface()из программы Switch. Их пришлось переименовать, потому что теперь существуют две поверхности меню: одна — для видеорежимов, а другая — для частот смены кадров. Функции CreateModeMenuSurface()и UpdateModeMenuSurface()работают с поверхностью меню видеорежимов. Две новые функции, CreateRateMenuSurface()и UpdateRateMenuSurface(), предназначены для работы с поверхностью меню частот.
Теперь давайте рассмотрим новые и изменившиеся переменные класса. Указатель menusurfиз программы Switch был переименован в modemenusurfпо той же причине, по которой были переименованы функции для работы с поверхностью меню видеорежимов. Далее в классе появились шесть новых переменных. Я снова приведу объявления новых переменных класса из листинга 4.6:
LPDIRECTDRAWSURFACE ratemenusurf;
int selectrate;
int numrates;
BOOL ratemenu_up;
BOOL include_refresh;
CArray refresh_rates[MAXDISPLAYMODES];
Переменная ratemenusurfпредставляет собой указатель на интерфейс DirectDrawSurfaceи используется для работы с поверхностью меню частот. В целых переменных selectrateи numratesхранятся соответственно текущая выделенная частота и общее количество отображаемых частот. Логическая переменная ratemenu_upпоказывает, отображается ли меню частот в данный момент.
Значение логической переменной include_refreshопределяется выбором пользователя, сделанным в окне диалога при старте программы. Если эта переменная равна TRUE, программа создает и выводит меню со списком частот для каждого выделенного видеорежима. Если переменная равна FALSE, частоты не отображаются. Наконец, массив refresh_ratesпредназначен для хранения возможных частот каждого видеорежима. Содержимое массива определяется с помощью косвенно вызываемой функции StoreModeInfo()и используется функцией UpdateRateMenusurface().
Читать дальше