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

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

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

}

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ прилоТСния Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ StorePixelFormatData() ΠΈ CreateCustomSurfaces(), происходящим Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnCreate(). ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Π΄ΡƒΡ‚ сСбя Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² полноэкранном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

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

Как ΠΈ Π² полноэкранном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅, для обновлСния экрана класс DirectDrawWin Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DrawScene(). Π•Π΅ рСализация для ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ отличаСтся ΠΎΡ‚ полноэкранного Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΏΠΎ Π΄Π²ΡƒΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅ выполняСтся ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц, содСрТимоС Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° приходится ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, мСстонахоТдСниС Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΎΠΊΠ½Π°. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ β€” пСрвичная ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ вСсь экран, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΊΠ½Π°. ΠžΠΊΠΎΠ½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ DrawScene() выглядит Ρ‚Π°ΠΊ:

void BounceWin::DrawScene() {

 ClearSurface(backsurf, 0);

 CRect client=GetClientRect();

 int width=client.Width();

 int height=client.Height();

 x+=xinc;

 y+=yinc;

 if (x<-160 || x>width-160) {

  xinc=-xinc;

  x+=xinc;

 }

 if (y<-100 || y>height-100) {

  yinc=-yinc;

  y+=yinc;

 }

 BltSurface(backsurf, surf1, x, y);

 int offsetx=client.left;

 int offsety=client.top;

 RECT srect;

 srect.left=0;

 srect.top=0;

 srect.right=client.Width();

 srect.bottom=client.Height();

 RECT drect;

 drect.left=offsetx;

 drect.top=offsety;

 drect.right=offsetx+client.Width();

 drect.bottom=offsety+client.Height();

 primsurf->Blt(&drect, backsurf, &srect, DDBLT_WAIT, 0);

}

Ѐункция DrawScene() выполняСт Π΄Π²Π΅ Π±Π»ΠΈΡ‚-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТимоС повСрхности surf1 Π½Π° Π²Π½Π΅ΡΠΊΡ€Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BltSurface(), рассмотрСнной Π½Π°ΠΌΠΈ Π²Ρ‹ΡˆΠ΅. АвтоматичСскоС отсСчСниС, выполняСмоС BltSurface(), позволяСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π° повСрхности surf1.

Вторая Π±Π»ΠΈΡ‚-опСрация ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТимоС Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. На этот Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция Blt(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности присоСдинСн ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ srect ΠΈ drect Ρ‚ΠΈΠΏΠ° RECT ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ области источника ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°, ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³Π΅. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ вычислСнии области ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ offsetx ΠΈ offsety, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранятся ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ клиСнтской области ΠΎΠΊΠ½Π°. Если ΡƒΠ±Ρ€Π°Ρ‚ΡŒ эти смСщСния ΠΈΠ· структуры drect, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ экрана нСзависимо ΠΎΡ‚ располоТСния ΠΎΠΊΠ½Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ ΠΈΠ·ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ вСсь ΠΊΠΎΠ΄, сгСнСрированный AppWizard. РассмотрСнноС Π½Π°ΠΌΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, поэтому ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. НапримСр, ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Bounce Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ повСрхности ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ BltSurface() Π½Π° BltFast() ΠΈ посмотритС, Ρ‡Ρ‚ΠΎ получится.

Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части ΠΊΠ½ΠΈΠ³ΠΈ Ρ€Π΅Ρ‡ΡŒ Π² основном ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ измСнСния слСдуСт внСсти Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’ Π³Π»Π°Π²Π΅ 4 ΠΌΡ‹ напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ возмоТности DirectDraw ΠΏΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ².

Π“Π»Π°Π²Π° 4. Π’ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΡ‹ ΠΈ частота смСны ΠΊΠ°Π΄Ρ€ΠΎΠ²

Π’ Π³Π»Π°Π²Π΅ 1 я ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EnumDisplayModes() ΠΈ SetDisplayMode() интСрфСйса DirectDraw ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ для обнаруТСния ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ². Π—Π΄Π΅ΡΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ познакомимся с ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ рассмотрим Π΄Π²Π΅ дСмонстрационных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: Switch ΠΈ SuperSwitch. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Switch Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ мСню с ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ ΠΈ позволяСт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° SuperSwitch Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ этому позволяСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ частоту смСны ΠΊΠ°Π΄Ρ€ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, ΠΌΠ½Π΅ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² этой Π³Π»Π°Π²Π΅ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ слоТного. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ β€” ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… возмоТностСй DirectDraw, Π΄Π° ΠΈ с частотой смСны ΠΊΠ°Π΄Ρ€ΠΎΠ² Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ тяТСло. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, я вовсС Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΏΠΎΡ€Π°Π·ΠΈΡ‚ΡŒ вас сообщСниСм ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² DirectDraw ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΡ‹. ВмСсто этого ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ², Π° Π·Π°ΠΎΠ΄Π½ΠΎ рассССм Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ распространСнныС заблуТдСния. ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» этой Π³Π»Π°Π²Ρ‹ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ прилоТСния с простым ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ².

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эта Π³Π»Π°Π²Π° прСслСдуСт ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ†Π΅Π»ΡŒ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Switch ΠΈ SuperSwitch ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ срСдства DirectDraw, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, скорСС всСго, Π²Π°ΠΌ пригодятся (ΠΈΠ»ΠΈ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ), β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ тСкста Π½Π° повСрхности. Π₯отя Ρƒ нас Π½Π΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ изучСния этих Ρ‚Π΅ΠΌ, ΠΌΡ‹ ΠΊΡ€Π°Ρ‚ΠΊΠΎ рассмотрим ΠΈΡ… Π² этой Π³Π»Π°Π²Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² дальнСйшСм Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ объяснСния ΡƒΠΆΠ΅ Π½Π΅ понадобились.

ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ²

Для бСзопасного Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetDisplayMode() интСрфСйса DirectDraw стоит Π·Π°Ρ€Π°Π½Π΅Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π²Π°ΠΌ Ρ€Π΅ΠΆΠΈΠΌ поддСрТиваСтся. Как ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 3, класс DirectDrawWin с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EnumDisplayModes() интСрфСйса DirectDraw строит список всСх доступных Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ². ΠŸΠΎΠ»ΡŒΠ·ΡƒΡΡΡŒ функциями доступа, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· этого массива для Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° SetDisplayMode().

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² Π½Π΅ сводится ΠΊ простому Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetDisplayMode(). По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π² класс DirectDrawWin Π±Ρ‹Π»Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° функция ActivateDisplayMode(), которая выполняСт всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ дСйствия для Π³Π»Π°Π΄ΠΊΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. ВскорС ΠΌΡ‹ рассмотрим ActivateDisplayMode() ΠΈ всС, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚, Π½ΠΎ сначала Π΄Π°Π²Π°ΠΉΡ‚Π΅ обратимся ΠΊ самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetDisplayMode().

Ѐункция SetDisplayMode()

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetDisplayMode(). ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ интСрфСйсу DirectDraw ΠΈ вызываСтся с трСмя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Вторая вСрсия ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ интСрфСйсу DirectDraw2 ΠΈ вызываСтся с ΠΏΡΡ‚ΡŒΡŽ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выглядит Ρ‚Π°ΠΊ:

HRESULT SetDisplayMode(DWORD width, DWORD height, DWORD depth);

Π‘ΠžΠ’Π•Π’

Для Π»ΡŽΠ±ΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ

Заглянув Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» DirectDraw (ddraw.h), Π²Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Π½Π΅ΠΌ этого ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ DirectDraw ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° IDL (языкС опрСдСлСния интСрфСйсов) спСцификации COM. На IDL функция SetDisplayMode() выглядит Ρ‚Π°ΠΊ:

STDMETHOD(SetDisplayMode)(THIS_ DWORD, DWORD, DWORD) PURE;

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

Ѐункция SetDisplayMode(), ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ DirectX API, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° HRESULT β€” 32-Ρ€Π°Π·Ρ€ΡΠ΄Π½ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ с описаниСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π•Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ DD_OK ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² оказался ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ.

ВСрсия SetDisplayMode() ΠΈΠ· интСрфСйса DirectDraw ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ‚ΠΈΠΏΠ° DWORD. Π­Ρ‚ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ экрана ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ пиксСлСй Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°, поэтому стандартный Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ VGA 640Γ—480Γ—8 активизируСтся Ρ‚Π°ΠΊ:

ddraw1->SetDisplayMode(640, 480, 8);

Выглядит довольно просто, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ вСрсии SetDisplayMode() ΠΈΠ· интСрфСйса DirectDraw2. Π•Π΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ выглядит Ρ‚Π°ΠΊ:

HRESULT SetDisplayMode(DWORD width, DWORD height, DWORD depth,  DWORD refreshrate, DWORD flags);

Π’ этой вСрсии ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: частота смСны ΠΊΠ°Π΄Ρ€ΠΎΠ² ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях DirectDraw, Π° ΠΏΠΎΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ. Π’ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ вСрсии SetDisplayMode() стандартный Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ VGA 640Γ—480Γ—8 ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

ddraw1->SetDisplayMode(640, 480, 8, 0, 0);

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС вмСсто частоты смСны ΠΊΠ°Π΄Ρ€ΠΎΠ² пСрСдаСтся 0; это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ использована частота, принятая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ частоты (60 Π“Ρ† Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅):

ddraw1->SetDisplayMode(640, 480, 8, 60, 0);

Однако Π½Π΅ слСдуСт Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ частоту (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°). ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ SetDisplayMode(), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ частоты допустимых Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ².

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ частот смСны ΠΊΠ°Π΄Ρ€ΠΎΠ²

Π’ Π³Π»Π°Π²Π΅ 3 Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ функция EnumDisplayModes() интСрфСйса DirectDraw пСрСчисляСт всС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Π΅ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΡ‹. Π§Π΅Ρ€Π΅Π· косвСнно Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΎΠ½Π° сообщаСт Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΌ установлСнными видСоустройствами. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EnumDisplayModes() выглядит Ρ‚Π°ΠΊ: