Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° для Windows срСдствами DirectDrawΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 40

Автор Бтэн Π’Ρ€ΡƒΡ…ΠΈΠ»ΡŒΠΎ

Листинг 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.