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

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

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

Но ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BltSurface(), ΠΌΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ рассмотрСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DrawScene(). Она Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Flip(). ΠŸΡ€ΠΈ этом происходит ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц, ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π°ΠΌΠΈ ΠΊΠ°Π΄Ρ€ отобраТаСтся Π½Π° экранС. Ѐункция Flip() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° DWORD, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΡƒΡŽ для установки Ρ„Π»Π°Π³ΠΎΠ². Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ лишь Π² нСстандартных ситуациях, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ повСрхностСй участвуСт нСсколько Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹Ρ… Π±ΡƒΡ„Π΅Ρ€ΠΎΠ². Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ содСрТит Ρ„Π»Π°Π³ DDFLIP_WAIT, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ.

Ѐункция BltSurface()

Ѐункция BltSurface() класса DirectDrawWin оказываСтся Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΎΠΉ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с функциями DirectDrawSurface::Blt() ΠΈ BltFast(). ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΠΊ BltSurface() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BounceWin::DrawScene(), Π° сСйчас рассмотрим саму Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Ѐункция BltSurface() Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° пятый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ нСобязатСлСн. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° повСрхности β€” источник ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° β€” ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ области Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³ выполняСтся Π±Π΅Π· Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ пятого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BltSurface() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.3.


Листинг 3.3. Ѐункция BltSurface()

BOOL DirectDrawWin::BltSurface(LPDIRECTDRAWSURFACE destsurf, LPDIRECTDRAWSURFACE srcsurf, int x, int y, BOOL srccolorkey) {

 if (destsurf==0 || srcsurf==0) return FALSE;

 BOOL use_fastblt=TRUE;

 DDSURFACEDESC destsurfdesc;

 ZeroMemory(&destsurfdesc, sizeof(destsurfdesc));

 destsurfdesc.dwSize = sizeof(destsurfdesc);

 destsurf->GetSurfaceDesc(&destsurfdesc);

 CRect destrect;

 destrect.left=0;

 destrect.top=0;

 destrect.right=destsurfdesc.dwWidth;

 destrect.bottom=destsurfdesc.dwHeight;

 DDSURFACEDESC srcsurfdesc;

 ZeroMemory(&srcsurfdesc, sizeof(srcsurfdesc));

 srcsurfdesc.dwSize = sizeof(srcsurfdesc);

 srcsurf->GetSurfaceDesc(&srcsurfdesc);

 CRect srcrect;

 srcrect.left=0;

 srcrect.top=0;

 srcrect.right=srcsurfdesc.dwWidth;

 srcrect.bottom=srcsurfdesc.dwHeight;

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ...

 if (x+srcrect.left>=destrect.right) return FALSE;

 if (y+srcrect.top>=destrect.bottom) return FALSE;

 if (x+srcrect.right<=destrect.left) return FALSE;

 if (y+srcrect.bottom<=destrect.top) return FALSE;

 // ΠŸΡ€ΠΈ нСобходимости Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ отсСчСниС

 // для ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ области источника

 if (x+srcrect.right>destrect.right) srcrect.right-=x+srcrect.right-destrect.right;

 if (y+srcrect.bottom>destrect.bottom) srcrect.bottom-=y+srcrect.bottom-destrect.bottom;

 CRect dr;

 if (x<0) {

  srcrect.left=-x;

  x=0;

  dr.left=x;

  dr.top=y;

  dr.right=x+srcrect.Width();

  dr.bottom=y+srcrect.Height();

  use_fastblt=FALSE;

 }

 if (y<0) {

  srcrect.top=-y;

  y=0;

  dr.left=x;

  dr.top=y;

  dr.right=x+srcrect.Width();

  dr.bottom=y+srcrect.Height();

  use_fastblt=FALSE;

 }

 DWORD flags;

 if (use_fastblt) {

  flags=DDBLTFAST_WAIT;

  if (srccolorkey) flags |= DDBLTFAST_SRCCOLORKEY;

  destsurf->BltFast(x, y, srcsurf, &srcrect, flags);

 } else {

  flags=DDBLT_WAIT;

  if (srccolorkey) flags |= DDBLT_KEYSRC;

  destsurf->Blt(&dr, srcsurf, &srcrect, flags, 0);

 }

 return TRUE;

}

Π‘Π½Π°Ρ‡Π°Π»Π° функция BltSurface() провСряСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° повСрхности. Если хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ FALSE, Ρ‚Π΅ΠΌ самым сообщая ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅. Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CRect ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² соотвСтствии с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ повСрхностСй, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DirectDrawSurface::GetSurfaceDesc().

Π—Π°Ρ‚Π΅ΠΌ BltSurface() провСряСт, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ Ρ‚ΠΎΡ‡ΠΊΠ° назначСния Π² Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. Если ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y Ρ‚Π°ΠΊΠΎΠ²Ρ‹, Ρ‡Ρ‚ΠΎ копия Π½Π΅ пСрСсСкаСтся с ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³ Π½Π΅ Π½ΡƒΠΆΠ΅Π½, поэтому ΠΌΡ‹ просто Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Если ΠΆΠ΅ с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ назначСния всС Π² порядкС, функция провСряСт, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ отсСчСниС. Если отсСчСниС Π½Π΅ трСбуСтся, Π±Π»ΠΈΡ‚-опСрация для достиТСния максимального быстродСйствия выполняСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ BltFast(). Если отсСчСниС всС ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, придСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Blt().

Если отсСчСниС выполняСтся ΠΏΠΎ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΌΡƒ ΠΊΡ€Π°ΡŽ источника, функция BltFast() справится с Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΈ ΠΎΠ±Ρ€Π΅ΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ области. Если ΠΆΠ΅ отсСчСниС происходит ΠΏΠΎ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌΡƒ ΠΈΠ»ΠΈ Π»Π΅Π²ΠΎΠΌΡƒ ΠΊΡ€Π°ΡŽ, приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Blt(), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ BltFast() Π½Π΅ позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. ПослС выполнСния Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³Π° BltSurface() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

ВосстановлСниС повСрхностСй

НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡƒΡ‡Π½ΠΎ инициализируСтся ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ графичСскиС Π΄Π°Π½Π½Ρ‹Π΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ повСрхностСй. ΠŸΡ€ΠΈ рассмотрСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DirectDrawWin::PreDrawScene ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ DirectDrawWin Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ RestoreSurfaces(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ потСрянныС повСрхности. Ѐункция RestoreSurfaces() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° восстановлСниС ΠΊΠ°ΠΊ потСрянной памяти повСрхности, Ρ‚Π°ΠΊ ΠΈ Π΅Π΅ содСрТимого. Ѐункция BounceWin::RestoreSurfaces() выглядит Ρ‚Π°ΠΊ:

void BounceWin::RestoreSurfaces() {

 if (surf1->IsLost()==FALSE) return;

 CString filename;

 if (GetCurDisplayDepth()==8) filename="tri08.bmp";

 else filename="tri24.bmp";

 surf1->Restore();

 LoadSurface(surf1, filename);

}

DirectDraw ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π½ΠΈΠΌΠ°Ρ‚ΡŒ Ρƒ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ прилоТСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ повСрхности, находящиСся Π² видСопамяти, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ смысла Π² восстановлСнии повСрхностСй ΠΈΠ· систСмной памяти. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ RestoreSurfaces() сначала провСряСт, Π±Ρ‹Π»Π° Π»ΠΈ потСряна СдинствСнная Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ нашСго прилоТСния, ΠΈ Ссли Π½Π΅Ρ‚ β€” функция ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Если ΠΆΠ΅ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° потСряна, ΠΌΡ‹ восстанавливаСм Π΅Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Restore(), Π° содСрТимоС β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LoadSurface().

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅

Как Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»Π° Ρ…ΠΎΡ€ΠΎΡˆΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Bounce, Ρ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ Π²Π°ΠΌ захочСтся ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π΅ с экрана. НаТатиС клавиши Escape Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ происходит Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnKeyDown():

void bounceWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {

 if (nChar==VK_ESCAPE) PostMessage(WM_CLOSE);

 DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, отправляя сообщСниС WM_CLOSE. Π’ нашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π° это сообщСниС Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈ класс ΠΎΠΊΠ½Π°, ΠΈ класс прилоТСния. Класс ΠΎΠΊΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ сообщСниСм WM_DESTROY, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² DirectDrawWin прСдусмотрСн ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ OnDestroy(). Класс DirectDrawWin Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ освобоТдаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ DirectDraw ΠΈ всю ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡƒΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Ѐункция OnDestroy() выглядит Ρ‚Π°ΠΊ:

void DirectDrawWin::OnDestroy() {

 if (primsurf) primsurf->Release(), primsurf=0;

  if (palette) palette->Release(), palette=0;

  if (ddraw2) ddraw2->Release(), ddraw2=0;

  for (int i=0;i<totaldrivers;i++) {

   if (driver[i].guid) delete[] driver[i].guid;

   free(driver[i].desc);

   free(driver[i].name);

  }

 }

}

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° интСрфСйсы DirectDraw сначала освобоТдаСтся, Π° Π·Π°Ρ‚Π΅ΠΌ обнуляСтся. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°Ρ… DirectDraw.

Класс прилоТСния ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ExitInstance(), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ удаляСтся класс ΠΎΠΊΠ½Π°:

int DirectDrawApp::ExitInstance() {

 delete ddwin;

 return CWinApp::ExitInstance();

}

На этом нашС знакомство с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Bounce заканчиваСтся. Однако Π΄ΠΎ сих ΠΏΠΎΡ€ Ρ€Π΅Ρ‡ΡŒ шла Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ полноэкранных прилоТСниях. ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ этой Π³Π»Π°Π²Ρ‹ посвящСна ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌ прилоТСниям.

ΠžΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния

НавСрноС, Π²Ρ‹ ΡƒΠΆΠ΅ поняли, Ρ‡Ρ‚ΠΎ полноэкранным прилоТСниям Π² этой ΠΊΠ½ΠΈΠ³Π΅ удСляСтся особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ВсС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° CD-ROM Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² полноэкранном Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΈ Π² этой Π³Π»Π°Π²Π΅ Π΄ΠΎ настоящСго ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° всС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ сосрСдоточСно ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° полноэкранных прилоТСниях.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΈΠ³Π° посвящСна Π±Ρ‹ΡΡ‚Ρ€ΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ графичСским Windows-прилоТСниям, Π° ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ быстродСйствия. Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρ‹ ΠΌΡ‹ рассмотрим ΠΎΠΊΠΎΠ½Π½Ρ‹Π΅ прилоТСния, Π½ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, ΠΊΠ°ΠΊ полноэкранныС. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ссли Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π² своих прилоТСниях, Π½Π΅ всС потСряно. МногиС описанныС ΠΏΡ€ΠΈΠ΅ΠΌΡ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π² полноэкранных прилоТСниях, Π² Ρ€Π°Π²Π½ΠΎΠΉ стСпСни относятся ΠΈ ΠΊ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΌ.

Π’ Π½Π°Ρ‡Π°Π»Π΅ этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ воспользовались DirectDraw AppWizard ΠΈ создали ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Bounce. ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ создаваСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ полноэкранной. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ рассматриваСмый Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄, слСдуСт снова Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ AppWizard ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.