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



Перед тем как заниматься программой SuperSwitch, я хочу снова напомнить, что не все видеокарты позволяют выбирать частоту смены кадров. Если программа SuperSwitch не обнаруживает такой возможности, меню частот будет содержать лишь одну строку — 0 Гц, где ноль обозначает частоту, принятую для данного видеорежима по умолчанию. 

Программа SuperSwitch 

Программа SuperSwitch, как и программа Switch, позволяет установить любой видеорежим, но, кроме того, для выбранного видеорежима можно задать и частоту смены кадров. Основной экран программы SuperSwitch выглядит так же, как и в Switch, но при выборе видеорежима появляется подменю с возможными частотами смены кадров (см. рис. 4.2).

Перед тем как инициализировать DirectDraw, программа выводит диалоговое окно с кратким описанием. В этом окне можно отключить смену частоты, и тогда программа работает точно так же, как и программа Switch. 

Класс 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 refresh_rates[MAXDISPLAYMODES];