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

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

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

 }

 if (bmpdialog->DoModal()==IDCANCEL) {

  PostMessage(WM_CLOSE);

  return;

 }

 fullfilename=bmpdialog->fullfilename;

 filename=bmpdialog->filename;

 pathname=bmpdialog->pathname;

 int index=bmpdialog->GetIndex();

 DWORD w,h,d;

 if (bmpdialog->FilePalettized()) {

  w=palettemode[index].w;

  h=palettemode[index].h;

  d=palettemode[index].d;

 } else {

  w=nonpalettemode[index].w;

  h=nonpalettemode[index].h;

  d=nonpalettemode[index].d;

 }

 if (GetDisplayDepth()==8) primsurf->SetPalette(palette);

 ActivateDisplayMode(GetDisplayModeIndex(w, h, d));

 LoadBmp();

 ShowCursor(FALSE);

}

Ѐункция ShowDialog() ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго провСряСт, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 640Γ—480. Из обсуТдСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectInitialDisplayMode() Π½Π°ΠΌ извСстно, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния это условиС Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ выполняСтся, ΠΎΠ΄Π½Π°ΠΊΠΎ функция ShowDialog() Ρ‚Π°ΠΊΠΆΠ΅ вызываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ BMP-Ρ„Π°ΠΉΠ»Π°. Если Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ установлСн Ρ€Π΅ΠΆΠΈΠΌ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ€Π΅ΠΆΠΈΠΌ 640Γ—480Γ—8. Π­Ρ‚ΠΎ обусловлСно Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΆΠΈΠΌΡ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ часто ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ Mode X, Π° GDI Π² Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹Π΅ ΠΎΠΊΠ½Π°.

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

Π‘ΠžΠ’Π•Π’

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстный Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ изобраТСния ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π² ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ΅, Π²Π°ΠΌ придСтся ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ 256 элСмСнтов ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ изобраТСния Π΄ΠΎ 236, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° Π² сСрСдину ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ (систСмныС Ρ†Π²Π΅Ρ‚Π° Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎ 10 элСмСнтов Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹) ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ пиксСли изобраТСния Π² соотвСтствии с внСсСнными измСнСниями. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это Π²Π΅Π΄Π΅Ρ‚ ΠΊ сниТСнию качСства изобраТСния, Π½ΠΎ присутствиС Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° всС Ρ€Π°Π²Π½ΠΎ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ изобраТСния ΠΈ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ FlipToGDISurface() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ GDI Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° экранС. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ курсор ΠΌΡ‹ΡˆΠΈ (ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ запускС прилоТСния классом DirectDrawWin), Ρ‡Ρ‚ΠΎΠ±Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²Ρ‹ΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΡ‹ΡˆΡŒΡŽ.

Π”Π°Π»Π΅Π΅ ΠΌΡ‹ создаСм экзСмпляр класса BmpDialog, Ссли ΠΎΠ½ Π½Π΅ Π±Ρ‹Π» создан Ρ€Π°Π½Π΅Π΅. Класс-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° BmpDialog создаСтся ClassWizard, ΠΎΠ½ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для отобраТСния Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ. Класс содСрТит ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ элСмСнтами ΠΎΠΊΠ½Π° ΠΈ Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Код класса BmpDialog здСсь Π½Π΅ рассматриваСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ DirectDraw.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠΏΡ€ΠΈ создании Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetArrays() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΉ массивы palettemode ΠΈ nonpalettemode Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π­Ρ‚Π° функция ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°Ρ…, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для отобраТСния ΠΊΠ°ΠΊ ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠ²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΈ бСспалитровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ отобраТаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DoModal(). ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Display лишь послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½ BMP-Ρ„Π°ΠΉΠ» ΠΈ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ. ΠŸΡ€ΠΈ этом ΠΌΡ‹ сохраняСм имя ΠΈ ΠΏΡƒΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ BMP-Ρ„Π°ΠΉΠ»Π° ΠΈ опрСдСляСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°. Если ΠΆΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, ΠΌΡ‹ посылаСм сообщСниС WM_CLOSE ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

НаконСц, функция ActivateDisplayMode() Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ, функция LoadBmp() Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ содСрТимоС BMP-Ρ„Π°ΠΉΠ»Π°, Π° курсор ΠΌΡ‹ΡˆΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ происходит Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„Π°ΠΉΠ»Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ LoadBmp(), которая Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ BMP-Ρ„Π°ΠΉΠ», Π½ΠΎ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ. Ѐункция LoadBmp() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 5.8.


Листинг 5.8. Ѐункция LoadBmp()

BOOL BmpViewWin::LoadBmp() {

 CWaitCursor cur;

 LPDIRECTDRAWSURFACE surf;

 surf=CreateSurface(filename, TRUE);

 if (surf) {

  if (bmpsurf)    bmpsurf->Release();

  bmpsurf=surf;

 } else {

  TRACE("failed to load new file\n");

  return FALSE;

 }

 displayrect=GetDisplayRect();

 TRACE("display: %d %d\n", displayrect.right, displayrect.bottom);

 GetSurfaceRect(bmpsurf, bmprect);

 TRACE("surface: %d %d\n", bmprect.right, bmprect.bottom);

 int mx = displayrect.Width()-bmprect.Width();

 if (mx<0) {

  xscroll=TRUE;

  xlimit=mx;

  x=0;

 } else {

  xscroll=FALSE;

  x=mx/2;

 }

 int my = displayrect.Height()-bmprect.Height();

 if (my<0) {

  yscroll=TRUE;

  ylimit=my;

  y=0;

 } else {

  yscroll=FALSE;

  y=my/2;

 }

 update_screen=TRUE;

 return TRUE;

}

Π‘Π½Π°Ρ‡Π°Π»Π° функция LoadBmp() создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ MFC CWaitCursor, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° врСмя Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° экранС отобраТался курсор Windows Π² Π²ΠΈΠ΄Π΅ пСсочных часов. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateSurface() ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅ΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ BMP-Ρ„Π°ΠΉΠ»Π°. РСализация CreateSurface() Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»Π°ΡΡŒ Ρ€Π°Π½Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅, поэтому ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ эта функция Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ BMP-Ρ„Π°ΠΉΠ» Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ.

Π—Π°Ρ‚Π΅ΠΌ LoadBmp() опрСдСляСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½ΠΎΠ²ΠΎΠΉ повСрхности ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса BmpViewWin, связанных с ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΎΠΉ ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ повСрхностСй. Если Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ повСрхности мСньшС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°, ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ цСнтрируСтся Π½Π° экранС; Ссли ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ большС, слСдуСт Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π΅Π΅ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ x ΠΈ y ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π° повСрхности, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ xlimit ΠΈ ylimit ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ. ЛогичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ xscroll ΠΈ yscroll ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° Π»ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° повСрхности.

НаконСц, логичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ update_screen присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE; ΠΎΠ½ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ функция DrawScene() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. О Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DrawScene() Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅. 

ГрафичСский Π²Ρ‹Π²ΠΎΠ΄ 

Ѐункция DrawScene() обновляСт экран Π² зависимости ΠΎΡ‚ состояния логичСской ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ update_screen. Если пСрСмСнная update_screen Ρ€Π°Π²Π½Π° FALSE, прСдполагаСтся, Ρ‡Ρ‚ΠΎ содСрТимоС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности Π½Π΅ устарСло, ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Ѐункция DrawScene() выглядит Ρ‚Π°ΠΊ:

void BmpViewWin::DrawScene() {

 if (update_screen && bmpsurf) {

  ClearSurface(backsurf, 0);

  BltSurface(backsurf, bmpsurf, x, y);

  primsurf->Flip(0, DDFLIP_WAIT);

  update_screen=FALSE;

 }

}

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

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° 

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π²ΠΎΠ΄Π°. НаТатыС клавиши ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ OnKeyDown(), которая выглядит Ρ‚Π°ΠΊ:

void BmpViewWin::OnKeyDown(UINT key, UINT nRepCnt, UINT nFlags) {

 switch (key) {

 case VK_UP:

  Up();

  break;

 case VK_DOWN:

  Down();

  break;

 case VK_LEFT:

  Left();

  break;

 case VK_RIGHT:

  Right();

  break;

 case VK_HOME:

  Home();

  break;

 case VK_END:

  End();

  break;

 case VK_PRIOR:

  PageUp();

  break;

 case VK_NEXT:

  PageDown();

  break;

 case VK_ESCAPE:

 case VK_SPACE:

 case VK_RETURN:

  ShowDialog();

  break;

 }

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

}

Π‘ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ взгляда Π½Π° листинг OnKeyDown() ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ клавиши ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вся ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° поручаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиш Escape, ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ Enter вызываСтся ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ функция ShowDialog(). Π­Ρ‚ΠΎ ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° послС Π²Ρ‹Π²ΠΎΠ΄Π° изобраТСния.