Графика для Windows средствами DirectDraw | страница 85
Перед тем как заниматься программой SuperSwitch, я хочу снова напомнить, что не все видеокарты позволяют выбирать частоту смены кадров. Если программа SuperSwitch не обнаруживает такой возможности, меню частот будет содержать лишь одну строку — 0 Гц, где ноль обозначает частоту, принятую для данного видеорежима по умолчанию.
Программа SuperSwitch, как и программа Switch, позволяет установить любой видеорежим, но, кроме того, для выбранного видеорежима можно задать и частоту смены кадров. Основной экран программы SuperSwitch выглядит так же, как и в Switch, но при выборе видеорежима появляется подменю с возможными частотами смены кадров (см. рис. 4.2).
Перед тем как инициализировать DirectDraw, программа выводит диалоговое окно с кратким описанием. В этом окне можно отключить смену частоты, и тогда программа работает точно так же, как и программа Switch.
Поскольку программа 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