ΠΠΈΡΡΠΈΠ½Π³ 6.1. ΠΠ»Π°ΡΡ QwertyWin
class QwertyWin : public DirectDrawWin {
public:
QwertyWin();
protected:
//{{AFX_MSG(QwertyWin)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnDestroy();
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int SelectDriver();
int SelectInitialDisplayMode();
BOOL CreateCustomSurfaces();
void DrawScene();
void RestoreSurfaces();
private:
LPDIRECTINPUT dinput;
LPDIRECTINPUTDEVICE keyboard;
BOOL esc_pressed;
LPDIRECTDRAWSURFACE esc_up, esc_dn;
LPDIRECTDRAWSURFACE space_up, space_dn;
LPDIRECTDRAWSURFACE q_up, q_dn;
LPDIRECTDRAWSURFACE w_up, w_dn;
LPDIRECTDRAWSURFACE e_up, e_dn;
LPDIRECTDRAWSURFACE r_up, r_dn;
LPDIRECTDRAWSURFACE t_up, t_dn;
LPDIRECTDRAWSURFACE y_up, y_dn;
LPDIRECTDRAWSURFACE rctrl_up, rctrl_dn;
LPDIRECTDRAWSURFACE lctrl_up, lctrl_dn;
LPDIRECTDRAWSURFACE lalt_up, lalt_dn;
LPDIRECTDRAWSURFACE ralt_up, ralt_dn;
};
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° OnKeyDown(). ΠΠΎ Π²ΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΡ Π½Π°ΠΌΠΈ ΡΠ°Π½Π΅Π΅, ΡΡΠ½ΠΊΡΠΈΡ OnKeyDown() ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π»Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Qwerty ΠΌΡ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΡΠ»ΡΠ³Π°ΠΌΠΈ DirectInput ΠΈ ΠΏΠΎΡΠΎΠΌΡ Π½Π΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌΡΡ Π² OnKeyDown().
Π ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ ΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ:
β’ OnCreate()
β’ OnDestroy()
β’ OnActivate()
Π€ΡΠ½ΠΊΡΠΈΡ OnCreate() ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅Ρ DirectInput, Π° ΡΡΠ½ΠΊΡΠΈΡ OnDestroy() ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ DirectInput. Π€ΡΠ½ΠΊΡΠΈΡ OnActivate(), Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ MFC ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ΅ΡΠ΅ ΡΠΎΠΊΡΡΠ°, Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π° Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ Π·Π°Ρ Π²Π°ΡΠ° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ.
ΠΠ²Π΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, SelectDriver() ΠΈ SelectInitialDisplayMode(), ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ ΠΏΠΎΡΡΠΈ Π²ΠΎ Π²ΡΠ΅Ρ Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ . ΠΠ½ΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΈΡ ΡΠΎΠ·Π΄Π°Π» AppWizard, ΠΈ ΠΏΠΎΡΠΎΠΌΡ Π½Π΅ ΡΡΠ΅Π±ΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΠΈ CreateCustomSurfaces() ΠΈ RestoreSurfaces() Π΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅, ΡΡΠΎ ΠΈ ΡΠ°Π½ΡΡΠ΅, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠΎΠΆΠ΅ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡ ΠΈ Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ, ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ Π»ΠΈΡΡΠΈΠ½Π³Π° 6.1.
Π€ΡΠ½ΠΊΡΠΈΡ DrawScene() Ρ ΠΏΠΎΠΌΠΎΡΡΡ DirectInput ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ Π±ΡΠ»ΠΈ Π½Π°ΠΆΠ°ΡΡ, ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄. ΠΡΠΊΠΎΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠΎΡΠ»Π΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΠ»Π΅Π΄ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°. Π‘Π½Π°ΡΠ°Π»Π° ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DirectInput(dinput), ΡΠ΅ΡΠ΅Π· Π½Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ DirectInput. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ key β ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DirectInputDevice, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΉ ΠΊ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅. ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ esc_pressed ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΡΠ°Π²ΡΠ°ΡΡΡ ΡΠ°ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ DirectDrawSurface. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΡΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π²Π΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ (Π΄Π»Ρ Π½Π°ΠΆΠ°ΡΠΎΠ³ΠΎ ΠΈ ΠΎΡΠΏΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ).
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ DirectInput
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ DirectInput ΠΈ DirectDraw Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ OnCreate(). DirectInput ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΈΠ΅ΠΉ OnCreate() ΠΊΠ»Π°ΡΡΠ° QwertyWin, Π° DirectDraw β Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΈΠ· DirectDrawWin. Π€ΡΠ½ΠΊΡΠΈΡ QwertyWin::OnCreate() ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.2.
ΠΠΈΡΡΠΈΠ½Π³ 6.2. Π€ΡΠ½ΠΊΡΠΈΡ QwertyWin::OnCreate()
int QwertyWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {
HRESULT r=DirectInputCreate(AfxGetInstanceHandle(), DIRECTINPUT_VERSION, &dinput, 0);
if (r!=DI_OK) {
AfxMessageBox("DirectInputCreate() failed");
return -1;
}
r = dinput->CreateDevice(GUID_SysKeyboard, &keyboard, 0);
if (r!=DI_OK) {
AfxMessageBox("CreateDevice(keyboard) failed");
return -1;
}
r = keyboard->SetDataFormat(&c_dfDIKeyboard);
if (r!=DI_OK) {
AfxMessageBox("keyboard->SetDataFormat() failed");
return -1;
}
r=keyboard->SetCooperativeLevel(GetSafeHwnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if (r!=DI_OK) {
AfxMessageBox("keyboard->SetCooperativeLevel() failed");
return -1;
}
if (DirectDrawWin::OnCreate(lpCreateStruct)==-1) return -1;
return 0;
}
ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ β Π²Π΅ΡΡΠΈΡ OnCreate() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π»ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ DirectInput ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΎΠΊΠ½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ Π±Π΅Π· ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ DirectDraw.
Π‘Π½Π°ΡΠ°Π»Π° ΡΡΠ½ΠΊΡΠΈΡ OnCreate() ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ dinput Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ DirectInputCreate(), ΠΊΠΎΡΠΎΡΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅ΡΡΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°. ΠΡΠ·ΠΎΠ² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
HRESULT r=DirectInputCreate(AfxGetInstanceHandle(), DIRECTINPUT_VERSION, &dinput, 0);
ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ - Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ AfxGetInstanceHandle(). ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β Π½ΠΎΠΌΠ΅Ρ Π²Π΅ΡΡΠΈΠΈ DirectInput. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° DIRECTINPUT_VERSION, ΠΎΠ½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ DirectInput Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π²Π΅ΡΡΠΈΠΈ SDK, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ DirectInput Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ Π½ΠΈΠΆΠ΅. Π’ΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ DirectInputCreate() β Π°Π΄ΡΠ΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π° ΡΠ΅ΡΠ²Π΅ΡΡΡΠΉ β ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ COM, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ (Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠ°Ρ Π² COM). ΠΡΠ»ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ DirectInput ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ (ΡΠΎ Π΅ΡΡΡ Π΅ΡΠ»ΠΈ DirectInputCreate() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ DI_OK), ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ dinput ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ DirectInput.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInputDevice, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ. Π― ΡΠ½ΠΎΠ²Π° ΠΏΡΠΈΠ²Π΅Π΄Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ Π»ΠΈΡΡΠΈΠ½Π³Π° 6.2:
r = dinput->CreateDevice(GUID_SysKeyboard, &keyboard, 0);
Π€ΡΠ½ΠΊΡΠΈΡ CreateDevice() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInput ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ² DirectInput. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ²ΡΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° GUID_SysKeyboard, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΠ°Ρ, ΡΡΠΎ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠΉ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠΎΠΉ. ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β Π°Π΄ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ keyboard, ΡΠ΅ΡΠ΅Π· ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅. Π’ΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π°Π³ΡΠ΅Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ COM, Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β Π²ΡΠ±ΠΎΡ ΡΠΎΡΠΌΠ°ΡΠ° Π΄Π°Π½Π½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°. ΠΠ»Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎ:
r = keyboard->SetDataFormat(&c_dfDIKeyboard);
Π€ΡΠ½ΠΊΡΠΈΠΈ SetDataFormat() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInputDevice ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ β ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° c_dfDIKeyboard. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Qwerty ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈΡΡ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ (ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠΎΠΉ), Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ±Π΅Π΄ΠΈΠΌΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Smear, ΡΠΎΡΠΌΠ°Ρ Π΄Π°Π½Π½ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π΄Π°Π²Π°ΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°Π΄Π°Π΅ΠΌ ΡΡΠΎΠ²Π΅Π½Ρ ΠΊΠΎΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ SetCooperativeLevel() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInputDevice. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ Π»ΠΈΡΡΠΈΠ½Π³Π° 6.2 Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
r=keyboard->SetCooperativeLevel(GetSafeHwnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
Π€ΡΠ½ΠΊΡΠΈΡ SetCooperativeLevel() ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄Π²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°: Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΎΠΊΠ½Π° ΠΈ Π½Π°Π±ΠΎΡ ΡΠ»Π°Π³ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ ΡΡΠΎΠ²Π΅Π½Ρ ΠΊΠΎΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ GetSafeHwnd() ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΎΠΊΠ½Π°, Π° ΡΠ»Π°Π³ΠΈ DISCL_FOREGROUND ΠΈ DISCL_NONEXCLUSIVE Π·Π°Π΄Π°ΡΡ Π½ΡΠΆΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΊΠΎΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π€Π»Π°Π³ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° DISCL_FOREGROUND ΠΏΡΠΈΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π½Π° Π²ΡΠ΅ΠΌΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΌ Π½Π΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²Π²ΠΎΠ΄ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ, Π° ΡΠ»Π°Π³ DISCL_NONEXCLUSIVE β ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ DirectInput Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ΅.
ΠΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΎΡΡΠ°Π»ΡΡ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π³: ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Ρ Π²Π°ΡΠΈΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Acquire(). ΠΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ OnActivate(), ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½ΠΈΠΆΠ΅.
Π€ΡΠ½ΠΊΡΠΈΡ QwertyWin::OnCreate() Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ DirectDrawWin::OnCreate(), ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ΅ΠΉ DirectDraw. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»Π°ΡΡ Π² Π³Π»Π°Π²Π΅ 3.
ΠΠ°Ρ Π²Π°Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡΠΡΠ°ΠΊ, ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ DirectInput ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠ»ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΊ ΡΠ°Π±ΠΎΡΠ΅; ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π΅Π΅. ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ OnActivate(), ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π€ΡΠ½ΠΊΡΠΈΡ OnActivate() Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
void QwertyWin::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {
DirectDrawWin::OnActivate(nState, pWndOther, bMinimized);
if (nState!=WA_INACTIVE && keyboard) {
TRACE("keyboard->Acquire()\n");
keyboard->Acquire();
}
}
ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° Π²Π΅ΡΡΠΈΠΈ OnActivate() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π»ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΡΡΠ½ΠΊΡΠΈΡ OnActivate() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Π°ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅). ΠΡΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π΅Ρ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ Acquire() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInputDevice.
ΠΠ΅ΡΠ΅Π΄ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Acquire() ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ Π±ΡΠ»Π° Π»ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ° Π·Π°Ρ Π²Π°ΡΠ΅Π½Π° ΡΠ°Π½Π΅Π΅, Π½ΠΎ Π² ΡΡΠΎΠΌ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ. DirectInput ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ Π»ΠΈΡΠ½ΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Acquire().
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΊΠ»Π°Π²ΠΈΡΠ’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠ»Π°Π²ΠΈΡ. Π Π½Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ DrawScene(), ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΊΡΠ°Π½Π°. Π€ΡΠ½ΠΊΡΠΈΡ DrawScene() ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 6.3.