backsurf->BltFast(curx, cury, cursor, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
primsurf->Flip(0, DDFLIP_WAIT);
while (primsurf->GetFlipStatus(DDGFS_ISFLIPDONE)!=DD_OK);
// Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ (ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ
// ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ)
int x, y;
BOOL newclick=FALSE;
int count=mouseclickqueue.GetCount();
while (count--) {
MouseClickData mc=mouseclickqueue.RemoveTail();
if (mc.button==0) {
x=mc.x;
y=mc.y;
newclick=TRUE;
}
}
critsection.Unlock();
//------ ΠΠΎΠ½Π΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ -------
//------ Π‘Π΄Π΅Π»Π°ΡΡ ΠΏΠ°ΡΠ·Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠΉ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ ----
if (delay_value[dm_index]!=0) Sleep(delay_value[dm_index]);
//------ ΠΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΌΠ΅Π½Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ --------
if (newclick) {
int max_index=sizeof(delay_value)/sizeof(int)-1;
int menux=screen_width-dm_width+dm_margin;
int menuw=dm_width-dm_margin*2;
if (x>=menux && x<=menux+menuw) {
int index=(y-dm_header)/dm_entrysize;
if (index>=0 && index<=max_index && index!=dm_index) {
dm_index=index;
UpdateDelaySurface();
}
}
}
}
Π€ΡΠ½ΠΊΡΠΈΡ DrawScene() ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΠ΅ΠΌΠΈ ΡΡΠ°ΠΏΠΎΠ²:
1. ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠ»Π°Π²ΠΈΡΠΈ Escape.
2. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π΄ΡΠ° Π²ΠΎ Π²ΡΠΎΡΠΈΡΠ½ΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅.
3. ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΡΠ° (ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎ Π²ΡΠΎΡΠΈΡΠ½ΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅).
4. ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ.
5. ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΡΡΠΈ.
6. ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΡΡΠΈ.
7. ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ ΠΌΠ΅Π½Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ.
ΠΠ΅ΡΠ²ΡΠΉ ΡΡΠ°ΠΏ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ GetDeviceState() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectInputDevice. ΠΡΠ»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΎ Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ»Π°Π²ΠΈΡΠΈ Escape, ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ WM_CLOSE, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π²ΡΠΎΡΠΈΡΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° (ΡΡΠ°ΠΏ 2) Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΅Π³ΠΎ ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½Π΅Π³ΠΎ Π²Π½Π΅ΡΠΊΡΠ°Π½Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ. ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠ΅ΠΉ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° coil ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅Π»Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ (ΠΌΠ°ΡΡΠΈΠ² coil ΠΏΠΎΠ΄Π³ΠΎΡΠ°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ CustomSurfaces(), ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ).
ΠΠ° ΡΡΠ°ΠΏΠ°Ρ 3, 4 ΠΈ 5 ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ ΡΠ΅ΡΡΡΡΠ°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²Π²ΠΎΠ΄Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠ΅ΠΉ. ΠΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° CCriticalSection (critsection), ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ Π² ΠΊΠ»Π°ΡΡΠ΅ CursorWin (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 7.1), Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Lock(). ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ΄Π°ΡΠ½ΠΎΠΉ, ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Ρ Π²Π°ΡΡΠ²Π°Π΅Ρ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΡΡ ΡΠ΅ΠΊΡΠΈΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Π»ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ β ΠΏΠΎΡΠΎΠΊ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡΠ½ΡΠΌ ΠΏΡΠ°Π²ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π½ΠΈΠΌ. ΠΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Lock() Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠ°Π·Π°Π½ΠΎ Π² Π΄ΠΎΡΡΡΠΏΠ΅ (ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ ΡΡΠΎ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π·Π°Ρ Π²Π°ΡΠ΅Π½Π° ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²Π²ΠΎΠ΄Π°), ΡΡΠ½ΠΊΡΠΈΡ Lock() Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ.
ΠΠ° ΡΡΠ°ΠΏΠ΅ 3 ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΡΠΎΡΠΈΡΠ½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°, Π·Π°Π½ΡΡΠΎΠΉ ΠΊΡΡΡΠΎΡΠΎΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌ ΠΊΡΡΡΠΎΡ Π² Π±ΡΡΠ΅ΡΠ΅. ΠΠ±Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ BltFast() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDrawSurface.
ΠΠ° ΡΡΠ°ΠΏΠ΅ 4 Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΠΎ. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Flip() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDrawSurface Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΠ½Π° Π»ΠΈΡΡ ΠΏΡΠΈΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°ΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΡ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π²ΡΠ΅ ΡΠ°Π½Π΅Π΅ Π½Π°ΡΠ°ΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±Π»ΠΈΡΡΠΈΠ½Π³Π° Π²ΠΎ Π²ΡΠΎΡΠΈΡΠ½ΡΠΉ Π±ΡΡΠ΅Ρ. ΠΠ»Ρ Π½Π°ΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ ΡΡΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ Π±ΡΠ»ΠΎ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½ΠΎ Π΄ΠΎ ΠΊΠΎΠ΄Π° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ°Π½ΠΈΡ. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΈΠΊΠ»Π° while ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ GetFlipStatus() ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° DirectDrawSurface ΠΌΡ ΠΎΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ DirectDraw Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ (Π² DirectDraw Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎ ΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π½ΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π±Ρ ΠΎΠ½Π° ΠΈ Π±ΡΠ»Π°, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΡΡΡΡΠΎ ΠΈ Π½Π΅ ΠΎΠΏΡΠ°Π²Π΄ΡΠ²Π°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠΎΠΊΠ°).
ΠΠ° ΡΡΠ°ΠΏΠ΅ 5 ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΌΡΡΠΈ. ΠΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΡΡ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ ΠΎΠΏΡΡΡΠ΅Π΅Ρ. ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π»Π΅Π²ΠΎΠΉ (Π½ΡΠ»Π΅Π²ΠΎΠΉ) ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π΄Π»Ρ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ° ΡΡΠ°ΠΏΠ΅ 6 Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Π°Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Sleep() (ΡΡΠ½ΠΊΡΠΈΡ Sleep() Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄). ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΎΠΉ ΠΌΠ΅Π½Ρ Π·Π°Π΄Π΅ΡΠΆΠ΅ΠΊ, ΠΎΠ½Π° ΠΈΠΌΠΈΡΠΈΡΡΠ΅Ρ ΡΠΈΠ»ΡΠ½ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ ΡΡΠ΅Ρ ΠΌΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎΡΠ° Π²ΡΠ²ΠΎΠ΄Π° ΠΊΠ°Π΄ΡΠΎΠ² ΠΏΠ°Π΄Π°Π΅Ρ. ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΡΡΡΠΎΡΠ° Π½Π΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠ°ΡΡΠΎΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠ°Π΄ΡΠΎΠ².
ΠΡΠ°ΠΏ 6 Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ CCriticalSection::Unlock(). ΠΡΠ»ΠΈ ΠΊ ΡΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ ΠΏΠΎΡΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π±ΡΠ» Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π» Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠ΅ΠΉ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ, Π²ΡΠ·ΠΎΠ² Unlock() ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π΅ΠΌΡ Π²ΠΎΠΉΡΠΈ Π² Π½Π΅Π΅.
ΠΠ° ΡΡΠ°ΠΏΠ΅ 7 ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΡ ΠΌΠ΅Π½Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ β Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π»ΠΎ Π±Ρ ΡΠΏΡΡΡΠ°ΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠ΅Π½Ρ. ΠΠΎ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, Ρ ΡΠ΅ΡΠΈΠ» ΡΠΎΠΊΡΠ°ΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΎΡΡΠ°Π»Π°ΡΡ Β«ΡΡΡΠΎΠΉΒ». Π’Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅, Π½Π° ΡΡΠ°ΠΏΠ΅ 7 ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π½Π°ΠΆΠ°ΡΠΈΡ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡΡΠΈ ΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π½ΠΈΠΌΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΌΠ΅Π½Ρ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΠ°Π½Π° Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΡΠΎΠΊ Π²Π²ΠΎΠ΄Π°.
ΠΠΎΡΠΎΠΊ Π²Π²ΠΎΠ΄Π°ΠΡΠ»ΠΈ Π½Π΅ ΡΡΠΈΡΠ°ΡΡ Π΄Π²ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π²Π΅ΡΡ ΠΏΠΎΡΠΎΠΊ Π²Π²ΠΎΠ΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. Π€ΡΠ½ΠΊΡΠΈΡ MouseThread() ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 7.5.
ΠΠΈΡΡΠΈΠ½Π³ 7.5. Π€ΡΠ½ΠΊΡΠΈΡ MouseThread()
DWORD CursorWin::MouseThread(LPVOID p) {
TRACE("starting mouse thread\n");
CursorWin* win=(CursorWin*)p;
while(TRUE) {
CMultiLock mlock((CSyncObject**)mouse_event, 2);
DWORD event=mlock.Lock(INFINITE, FALSE);
if (event-WAIT_OBJECT_0==quit_event_index) {
TRACE("got quit message: quitting mouse thread\n");
return 0;
}
critsection.Lock();
oldcurx=curx;
oldcury=cury;
BOOL buffer_empty=FALSE;
while (!buffer_empty) {
DIDEVICEOBJECTDATA data;
DWORD elements=1;
if (mouse==0) {
TRACE("invalid pointer: quitting mouse thread\n");
return 0;
}
HRESULT r=mouse->GetDeviceData(sizeof(data), &data, &elements, 0);
if (r==DI_OK && elements==1) {
static MouseClickData mc;
switch data.dwOfs) {
case DIMOFS_X:
curx+=data.dwData;
break;
case DIMOFS_Y:
cury+=data.dwData;
break;
case DIMOFS_BUTTON0:
if (data.dwData & 0x80) {
mc.x=curx;
mc.y=cury;
mc.button=0;
mouseclickqueue.AddHead(mc);
}
break;
case DIMOFS_BUTTON1:
if (data.dwData & 0x80) {
mc.x=curx;
mc.y=cury;
mc.button=1;
mouseclickqueue.AddHead(mc);
}
break;
}
} else buffer_empty=TRUE;
}
if (curx<0) curx=0;
if (cury<0) cury=0;
if (curx>=screen_width-cursor_width) curx=screen_width-cursor_width-1;
if (cury>=screen_height-cursor_height) cury=screen_height-cursor_height-1;
if (curx==oldcurx && cury==oldcury) {
//----- ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΡΡΡΠΎΡΠ° Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ------
goto nevermind;
} else if (abs(curx-oldcurx) >= cursor_width || abs(cury-oldcury) >= cursor_height) {
//----- ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉ: ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ
// ΠΈ ΡΡΠ°ΡΠΎΠ³ΠΎ ΠΊΡΡΡΠΎΡΠ° Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡΡΡ -----
win->UpdateCursorSimpleCase(curx, cury, oldcurx, oldcury);
} else {
//----- ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ: ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ
// ΠΈ ΡΡΠ°ΡΠΎΠ³ΠΎ ΠΊΡΡΡΠΎΡΠ° ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ²Π°ΡΡΡΡ -----
win->UpdateCursorComplexCase(curx, cury, oldcurx, oldcury);
}
nevermind:;
critsection.Unlock();
}
TRACE("leaving mouse thread\n");
return 0;
};
Π€ΡΠ½ΠΊΡΠΈΡ MouseThread() ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ AfxBeginThread() ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ° (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 7.3). ΠΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ this, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠ»Π°ΡΡ CursorWin (ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ win). Π ΡΡΠ½ΠΊΡΠΈΠΈ MouseThread() ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ win Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ»Π΅Π½Π°ΠΌ ΠΊΠ»Π°ΡΡΠ° CursorWin.
Π€ΡΠ½ΠΊΡΠΈΡ MouseThread() Π² ΡΠΈΠΊΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΏΠΎ Π΄Π²ΡΠΌ ΡΠΎΠ±ΡΡΠΈΡΠΌ. ΠΠ»Π°ΡΡ CMultiLock ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡΠΌ ΠΎΡ ΠΌΡΡΠΈ, ΡΠ°ΠΊ ΠΈ ΠΏΠΎ ΡΠΎΠ±ΡΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ CMultiLock::Lock(). ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ Lock() Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π²ΡΠ΅Ρ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ - Π΄Π²ΡΡ ) Π·Π°Π΄Π°Π½Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΠΉ. ΠΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ FALSE Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Lock(), ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Ρ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ½ΠΈΠΌΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ.