Графика для Windows средствами DirectDraw

Класс SuperSwitchWin


Поскольку программа SuperSwitch является видоизмененной версией Switch, мы не будем обсуждать весь ее код. Вместо этого будут рассмотрены лишь отличающиеся фрагменты SuperSwitch.


Рис. 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<DWORD,DWORD> refresh_rates[MAXDISPLAYMODES]; HFONT smallfont, largefont; };


Отличия начинаются с функции OnCreate(). Мы переопределяем функцию DirectDrawWin::OnCreate() так, чтобы перед инициализацией DirectDraw в ней выводилось диалоговое окно (в котором можно отключить изменение частоты смены кадров).

Другая новая функция - StoreModeInfo(). Эта функция косвенного вызова вызывается при составлении списка частот каждого видеорежима. Как говорилось в главе 3, класс DirectDrawWin имеет для этой цели собственную функцию косвенного вызова (DisplayModeAvailable()).
Вместо того чтобы изменять класс DirectDrawWin, мы воспользуемся функцией StoreModeInfo(), приспособленной для целей конкретного приложения. Это означает, что список видеорежимов будет составляться дважды: сначала без частот смены кадров (класс DirectDrawWin), а потом с частотами (класс SuperSwitchWin).

Далее в списке идут четыре новые функции: