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

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

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

НаконСц, основной ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ прилоТСния. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ β€” ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСзависимо ΠΎΡ‚ основного ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π‘Π΅Π· извСщСния со стороны основного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ собираСтся Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, основной ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ просто ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π°; ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ сам ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΡ‚ основного ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠŸΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°

ΠŸΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ·ΠΊΠΎΠΉ спСциализациСй ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β€’ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ;

β€’ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ курсор;

β€’ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ;

β€’ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сигнал Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ основного ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Для получСния Π²Π²ΠΎΠ΄Π° ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΄Π²Π΅ схСмы: опрос ΠΈ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅. ΠžΠΏΡ€ΠΎΡ ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нашСго случая, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° постоянно остаСтся Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΌΡ‹ΡˆΡŒΡŽ. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° блокируСтся Π΄ΠΎ поступлСния Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ, ΠΎΠ½ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ расходуСт лишнСго процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎΡΡ Π² DirectInput ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° оповСщСния ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° DirectInput Π½Π΅ сообщит ΠΎ поступлСнии Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

ПослС получСния сигнала ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ обновляСт курсор ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΄Π²ΡƒΡ… способов, рассмотрСнных Π²Ρ‹ΡˆΠ΅. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ способ Π±ΡƒΠ΄Π΅Ρ‚ использован, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ курсора Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с основным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π½Π΅ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

НаконСц, ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° своС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала ΠΎΡ‚ основного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ΠΌΡ‹ΡˆΠΈ?

Π’ Π½Π°Ρ‡Π°Π»Π΅ этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ курсор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΌΠ΅Ρ€Ρ†Π°Π΅Ρ‚ ΠΈ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° пСрСмСщСния ΠΌΡ‹ΡˆΠΈ ΠΏΡ€ΠΈ любой частотС Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°Π΄Ρ€ΠΎΠ². Нам ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π½Π΅ считая собствСнно кодирования) Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ этим критСриям. ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΌΡ‹ΡˆΠΈ ΠΎΡ‚ прилоТСния. Если Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ исходного запуска ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈ синхронизации, наш основной ΠΏΠΎΡ‚ΠΎΠΊ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ прилоТСния ΠΈ Π½Π΅ занимаСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°.

Но стоит Π»ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ? Если основной ΠΏΠΎΡ‚ΠΎΠΊ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ происходит с ΠΌΡ‹ΡˆΡŒΡŽ, ΠΌΡ‹ Π½Π΅ смоТСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΡ‹ΡˆΡŒΡŽ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

ΠœΡ‹ поступили ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΡƒΠ΄Π°Π»ΠΈΠ² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ пСрСмСщСниях ΠΌΡ‹ΡˆΠΈ ΠΈΠ· основного ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ с ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ ΠΌΡ‹ΡˆΠΈ? НСобходимо ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ основному ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΎΠ± измСнСниях ΠΈΡ… состояния.

ΠŸΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΡƒΠΆΠ΅ занимаСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ, поэтому Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ β€” Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ свСдСния ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°Ρ… Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π—Π°Ρ‚Π΅ΠΌ основной ΠΏΠΎΡ‚ΠΎΠΊ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅, провСряя содСрТимоС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ двумя ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, Π½Π°ΠΌ придСтся ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ синхронизации. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΡƒΠΆΠ΅ присутствуСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° критичСских сСкций, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ синхронизации Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΡƒ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° экран ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉΡΡ спирали, мСню Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΈ курсор ΠΌΡ‹ΡˆΠΈ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°Π΄Ρ€Ρ‹ максимально часто, Π½ΠΎ мСню Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ позволяСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ частоту Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π° счСт Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅ (максимальная Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π²Π½Π° 500 ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡƒΠ½Π΄Π°ΠΌ, ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ замСдляСтся Π΄ΠΎ 2 FPS). Если Π±Ρ‹ курсор Π½Π΅ управлялся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Π΅Π³ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ происходило Π±Ρ‹ лишь с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π°. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ курсор ΠΌΡ‹ΡˆΠΈ Π½Π΅ зависит ΠΎΡ‚ основного ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΠ½ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ любой частотС Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 7.1.

Рис. 7.1. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor


ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Cursor ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π»Π°ΡΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π±ΠΎΡ€ΡŒΠ±ΠΎΠΉ. МнС ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° нСсколько ΠΌΠ΅Π»ΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ тСхничСскиС подробности ΠΈ ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ структуру ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Однако я справился с ΠΈΡΠΊΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ β€” Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ навСрняка Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ прямо ΠΏΠ΅Ρ€Π΅Π΄ собой, вмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΠΎ всСму ΠΊΠΎΠ΄Ρƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ ΠΌΠ΅Π½Π΅Π΅ структурированной ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ.

Π‘ΠžΠ’Π•Π’

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный курсор

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с курсором любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π’ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° CD-ROM использован нСбольшой курсор (12Γ—20 пиксСлСй), Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот стандартный Ρ€Π°Π·ΠΌΠ΅Ρ€. Для этого достаточно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ cursor_08.bmp ΠΈ/ΠΈΠ»ΠΈ cursor_24.bmp Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ с Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌΠΈ изобраТСниями курсоров.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² 8-Π±ΠΈΡ‚Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ соотвСтствСнно с 8-Π±ΠΈΡ‚Π½Ρ‹ΠΌ курсором. МногоС зависит ΠΎΡ‚ вашСго графичСского Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°, Π½ΠΎ, скорСС всСго, Π²Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚Π΅ΡΡŒ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠΉ, Ссли Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Ρ„Π°ΠΉΠ»ΠΎΠΌ cursor_08.bmp с CD-ROM ΠΊΠ°ΠΊ шаблоном для создания нСстандартного курсора. Π‘ курсором Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° True Color Π΄Π΅Π»ΠΎ обстоит ΠΏΡ€ΠΎΡ‰Π΅, Π½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ, придСтся слСгка ΠΏΠΎΠ΄ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SelectInitialDisplayMode(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ бСспалитровый Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ вмСсто ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²ΠΎΠ³ΠΎ.

Класс CursorWin 

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Cursor, ΠΊΠ°ΠΊ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ этой ΠΊΠ½ΠΈΠ³ΠΈ, построСна Π½Π° Π±Π°Π·Π΅ структурных классов DirectDrawWin ΠΈ DirectDrawApp. Π­Ρ‚ΠΈ классы ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Π° вся спСцифика прилоТСния рСализуСтся классом CursorWin. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ курсора ΠΌΡ‹ΡˆΠΈ, вСроятно, слСдовало Π±Ρ‹ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² структурный класс. И всС ΠΆΠ΅ для наглядности я объСдинил ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с курсором со спСцифичСским ΠΊΠΎΠ΄ΠΎΠΌ прилоТСния. Класс CursorWin ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 7.1.


Листинг 7.1. Класс CursorWin

class CursorWin : public DirectDrawWin {

public:

 CursorWin();

protected:

 //{{AFX_MSG(CursorWin)

 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:

 BOOL InitMouse();

 BOOL InitKeyboard();

 BOOL UpdateDelaySurface();

private:

 //------- Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ------

 static DWORD MouseThread(LPVOID);

 BOOL UpdateCursorSimpleCase(int curx, int cury, int oldcurx, int oldcury);

 BOOL UpdateCursorComplexCase(int curx, int cury, int oldcurx, int oldcury);

private:

 //------- Π”Π°Π½Π½Ρ‹Π΅ ΠΌΡ‹ΡˆΠΈ -------

 static LPDIRECTINPUTDEVICE mouse;

 static CCriticalSection critsection;

 static CWinThread* mousethread;

 static CEvent* mouse_event[2];

 static int cursor_width;

 static int cursor_height;

 static LPDIRECTDRAWSURFACE cursor;

 static LPDIRECTDRAWSURFACE cursor_under;

 static LPDIRECTDRAWSURFACE cursor_union;

 static int curx, cury;

 static int oldcurx, oldcury;

 static CList<MouseClickData, MouseClickData> mouseclickqueue;

private:

 //------- Π”Π°Π½Π½Ρ‹Π΅ прилоТСния -------

 LPDIRECTINPUT dinput;

 LPDIRECTINPUTDEVICE keyboard;

 LPDIRECTDRAWSURFACE coil[coil_frames];

 LPDIRECTDRAWSURFACE dm_surf;

 int dm_index;

 DWORD menubarfillcolor;

 HFONT largefont, smallfont;

};

Класс CursorWin ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСний: OnCreate(), OnDestroy() ΠΈ OnActivate(). Ѐункция OnCreate() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ DirectDraw, DirectInput ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°. Ѐункция OnDestroy() освобоТдаСт интСрфСйсы DirectX ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°. Ѐункция OnActivate() обСспСчиваСт Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡ‹ΡˆΠΈ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ активности прилоТСния.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ класса DirectDrawWin:

β€’ SelectDriver()

β€’ SelectInitialDisplayMode()

β€’ CreateCustomSurfaces()

β€’ DrawScene()

β€’ RestoreSurfaces()

ΠœΡ‹ достаточно часто Π²ΠΈΠ΄Π΅Π»ΠΈ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… прилоТСниях ΠΈ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚, поэтому Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ…. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся функция DrawScene(), которая прСдставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ интСрСс, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π° занимаСтся синхронизациСй основного ΠΏΠΎΡ‚ΠΎΠΊΠ° с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π²Π²ΠΎΠ΄Π°.

Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ InitMouse() ΠΈ InitKeyboard(). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ OnCreate() ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² DirectInput, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡ‹ΡˆΡŒΡŽ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ. Ѐункция InitKeyboard() совпадаСт с ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ функциями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Qwerty ΠΈ Smear ΠΈΠ· Π³Π»Π°Π²Ρ‹ 6, поэтому ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ рассматриваСтся. Однако функция InitMouse() ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡ‹ΡˆΠΈ запускаСт ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π°. ВскорС ΠΌΡ‹ рассмотрим эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Ѐункция UpdateDelaySurface() Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ мСню Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ. Она Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ тСкст мСню ΠΈ выдСляСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ.

Π”Π°Π»Π΅Π΅ Π² классС CursorWin ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΡ‹ΡˆΠΈ: