Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ menusurf ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Switch Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² modemenusurf ΠΏΠΎ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Π΅, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡΡ ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². ΠΠ°Π»Π΅Π΅ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΡΠ΅ΡΡΡ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . Π― ΡΠ½ΠΎΠ²Π° ΠΏΡΠΈΠ²Π΅Π΄Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π½ΠΎΠ²ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 4.6:
LPDIRECTDRAWSURFACE ratemenusurf;
int selectrate;
int numrates;
BOOL ratemenu_up;
BOOL include_refresh;
CArray<DWORD,DWORD> refresh_rates[MAXDISPLAYMODES];
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ratemenusurf ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DirectDrawSurface ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡΡ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ. Π ΡΠ΅Π»ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ selectrate ΠΈ numrates Ρ ΡΠ°Π½ΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ΅ΠΊΡΡΠ°Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° ΠΈ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΡΠ°ΡΡΠΎΡ. ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ratemenu_up ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π»ΠΈ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ include_refresh ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π²ΡΠ±ΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠ΄Π΅Π»Π°Π½Π½ΡΠΌ Π² ΠΎΠΊΠ½Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³Π° ΠΏΡΠΈ ΡΡΠ°ΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΡΠ»ΠΈ ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π²Π½Π° TRUE, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΌΠ΅Π½Ρ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°. ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π²Π½Π° FALSE, ΡΠ°ΡΡΠΎΡΡ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΠ°ΡΡΠΈΠ² refresh_rates ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ°ΡΡΠΎΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ StoreModeInfo() ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ UpdateRateMenusurface().
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΠ°ΠΊ ΡΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡ Π²ΡΡΠ΅, ΠΏΠ΅ΡΠ΅Π΄ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ DirectDraw ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° SuperSwitch Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ SuperSwitchWin::OnCreate() Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ. ΠΠΎΡΠ»Π΅ Π²ΡΠ²ΠΎΠ΄Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π²Π΅ΡΡΠΈΡ OnCreate() ΠΊΠ»Π°ΡΡΠ° DirectDrawWin. ΠΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ SuperSwitchWin::OnCreate() Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
int SuperSwitchWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {
IntroDialog introdialog;
if (introdialog.DoModal()!=IDOK) return -1;
include_refresh=introdialog.include_refresh;
if (DirectDrawWin::OnCreate(lpCreateStruct)==-1) return -1;
if (include_refresh) ddraw2->EnumDisplayModes(DDEDM_REFRESHRATES, 0, this, StoreModeInfo);
return 0;
}
Π‘Π½Π°ΡΠ°Π»Π° ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° IntroDialog β ΡΡΠΎΡ ΠΊΠ»Π°ΡΡ-ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° Π±ΡΠ» ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ ClassWizard. ΠΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ CDialog::DoModal(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ IDOK Π² ΡΠ»ΡΡΠ°Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ OK. ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΆΠΈΠΌΠ°Ρ ΠΊΠ½ΠΎΠΏΠΊΡ Cancel), ΡΡΠ½ΠΊΡΠΈΡ OnCreate() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ β1, ΡΡΠΎ Π΄Π»Ρ MFC ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π±ΡΠ»Π° Π½Π°ΠΆΠ°ΡΠ° ΠΊΠ½ΠΎΠΏΠΊΠ° OK, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ include_refresh ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ»Π°ΠΆΠΊΠ° Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π²Π΅ΡΡΠΈΡ OnCreate() ΠΊΠ»Π°ΡΡΠ° DirectDrawWin, Π³Π΄Π΅ ΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ DirectDraw. Π€ΡΠ½ΠΊΡΠΈΡ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ², Π°ΠΊΡΠΈΠ²ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ OnCreate() Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΠΊΠΎΠ΄ β1.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ². ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ EnumDisplayModes() Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ»Π°Π³ DDEDM_REFRESHRATES, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠ°Π·Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΡΠ°ΡΡΠΎΡΡ. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°ΡΡΠΎΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°. Π§Π΅ΡΠ²Π΅ΡΡΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ EnumDisplayModes() β ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° StoreModeInfo(), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
HRESULT WINAPI SuperSwitchWin::StoreModeInfo(LPDDSURFACEDESC desc, LPVOID p) {
DWORD w=desc->dwWidth;
DWORD h=desc->dwHeight;
DWORD d=desc->ddpfPixelFormat.dwRGBBitCount;
DWORD r=desc->dwRefreshRate;
SuperSwitchWin* win=(SuperSwitchWin*)p;
int index=win->GetDisplayModeIndex(w, h, d);
win->refresh_rates[index].Add(r);
return DDENUMRET_OK;
}
Π€ΡΠ½ΠΊΡΠΈΠΈ StoreModeInfo()> ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΡΠΊΡΡΡΡ DDSURFACEDESC Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ°. Π ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π²Ρ ΠΎΠ΄ΠΈΡ ΡΠ°ΡΡΠΎΡΠ° ΡΠΌΠ΅Π½Ρ ΠΊΠ°Π΄ΡΠΎΠ² (ΠΏΠΎΠ»Π΅ dwRefreshRate), Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ΅ΠΆΠΈΠΌΠ°. ΠΠ°ΡΠ΅ΠΌ ΡΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΡΡΠΎΡΡ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅.
ΠΠΎΡΠ»Π΅ Π²ΡΡ ΠΎΠ΄Π° ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ OnCreate() ΠΊΠ»Π°ΡΡ DirectDrawWin Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ CreateCustomSurfaces(). ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ Switch ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ; ΠΎΠ½Π° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½ΠΎΠ²Π°Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ (ratemenusurface) ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
ΠΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²ΡΠ²ΠΎΠ΄ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ SuperSwitch ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ DrawScene(). ΠΠ½Π° ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Switch, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠ° Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΠ°ΡΡΠΎΡ. Π€ΡΠ½ΠΊΡΠΈΡ DrawScene() Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
void SuperSwitchWin::DrawScene() {
ClearSurface(backsurf, 0);
BltSurface(backsurf, bmpsurf, x, y);
x+=xinc; y+=yinc;
const CRect& displayrect=GetDisplayRect();
if (x<-160 || x>displayrect.right-160) {
xinc=-xinc;
x+=xinc;
}
if (y<-100 || y>displayrect.bottom-100) {
yinc=-yinc;
y+=yinc;
}
backsurf->BltFast(0, 0, modemenusurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
if (ratemenu_up) {
DWORD w,h;
GetSurfaceDimensions(ratemenusurf, w, h);
backsurf->BltFast((320-w)/2, (200-h)/2, ratemenusurf, 0, DDBLTFAST_WAIT);
}
UpdateFPSSurface();
if (displayfps) {
int x=displayrect.right-fpsrect.right;
int y=displayrect.bottom-fpsrect.bottom;
backsurf->BltFast(x, y, fpssurf, &fpsrect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
}
primsurf->Flip(0, DDFLIP_WAIT);
}
ΠΠΎΠ΄, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠΈΠΉ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ΄Π° ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ² (ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ²). ΠΡΠΈΡΡΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΡΠ»Π°Π³Π° ratemenu_up. ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΡΠ΅Π½ΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ².
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°Π’Π΅ΠΏΠ΅ΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ. ΠΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ OnKeyDown() (Π»ΠΈΡΡΠΈΠ½Π³ 4.7).
ΠΠΈΡΡΠΈΠ½Π³ 4.7. Π€ΡΠ½ΠΊΡΠΈΡ SuperSwitch::OnKeyDown()
void SuperSwitchWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
int newindex;
int nmodes=GetNumDisplayModes();
if (nmodes>maxmodes) nmodes=maxmodes;
int rows=nmodes/menucols;
if (nmodes%menucols) rows++;
switch (nChar) {
case VK_ESCAPE:
if (!include_refresh || !ratemenu_up) {
PostMessage(WM_CLOSE);
break;
}
if (ratemenu_up) {
ratemenu_up=FALSE;
if (ratemenusurf) ratemenusurf->Release(), ratemenusurf=0;
}
break;
case VK_UP:
if (include_refresh && ratemenu_up) {
if (selectrate>0) {
selectrate--;
UpdateRateMenuSurface();
}
} else {
newindex=selectmode-1;
if (newindex>=0) {
selectmode=newindex;
UpdateModeMenuSurface();
}
}
break;
case VK_DOWN:
if (include_refresh && ratemenu_up) {
if (selectrate<numrates-1) {
selectrate++;
UpdateRateMenuSurface();
}
} else {
newindex=selectmode+1;
if (newindex>nmodes) {
selectmode=newindex;
UpdateModeMenuSurface();
}
}
break;
case VK_LEFT:
if (include_refresh && ratemenu_up) break;
newindex=selectmode-rows;
if (newindex>=0) {
selectmode=newindex;
UpdateModeMenuSurface();
}
break;
case VK_RIGHT:
if (include_refresh && ratemenu_up) break;
newindex=selectmode+rows;
if (newindex<nmodes) {
selectmode=newindex;
UpdateModeMenuSurface();
}
break;
case VK_RETURN:
if (include_refresh) {
if (ratemenu_up) {
int rate=refresh_rates[selectmode][selectrate];
ActivateDisplayMode(selectmode, rate);
x=y=0;
ratemenu_up=FALSE;
} else {
CreateRateMenuSurface();
UpdateRateMenuSurface();
ratemenu_up=TRUE;
}
} else {
if (selectmode!=GetCurDisplayMode()) {
ActivateDisplayMode(selectmode);
x=y=0;
}
}
break;
case 'S':
SaveSurface(primsurf, "SuperSwitch.bmp");
break;
default:
DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);
}
}
ΠΡΠ΅ case-ΡΠ΅ΠΊΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° switch Π±ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π½ΠΎΠ²ΡΠΌ ΠΌΠ΅Π½Ρ. ΠΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Escape ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, Π΅ΡΠ»ΠΈ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ; ΡΠ΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΅ΡΠ»ΠΈ ΠΌΠ΅Π½Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ Π½Π° ΡΠΊΡΠ°Π½Π΅, ΠΊΠ»Π°Π²ΠΈΡΠ° Escape ΠΏΡΠΎΡΡΠΎ ΡΠΊΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ. ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡ ΡΠΎ ΡΡΡΠ΅Π»ΠΊΠ°ΠΌΠΈ ΡΠ°ΠΊΠΆΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΌΠ΅Π½Ρ. ΠΡΠ»ΠΈ ΠΌΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ, ΡΡΡΠ΅Π»ΠΊΠΈ Β ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ°ΡΡΠΎΡΡ, Π° Π΅ΡΠ»ΠΈ Π½Π΅Ρ β Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΡΠ½ΠΊΡ Π² ΠΌΠ΅Π½Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠ΅ΠΆΠΈΠΌΠΎΠ².