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

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

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

private:

 LPDIRECTDRAWSURFACE bmpsurf;

 int x, y;

 int xinc, yinc;

 LPDIRECTDRAWSURFACE menusurf;

 int selectmode;

 LPDIRECTDRAWSURFACE fpssurf;

 RECT fpsrect;

 BOOL displayfps;

 DWORD framecount;

 HFONT smallfont, largefont;

};

Класс SwitchWin содСрТит всСго ΠΎΠ΄Π½Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ (public) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ β€” конструктор класса (вскорС ΠΌΡ‹ Π΅Π³ΠΎ рассмотрим). Π’ классС Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт функция OnKeyDown() β€” ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний, созданный ClassWizard (Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ AFX, ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ OnKeyDown(), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ClassWizard для поиска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²). ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… клавиш β€” стрСлок, Enter ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌΠΎΠΉ клавиши Escape.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ вСрсиями Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ DirectDrawWin:

β€’ SelectDriver()

β€’ SelectInitialDisplayMode()

β€’ CreateCustomSurfaces()

β€’ DrawScene()

β€’ RestoreSurfaces()

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectDriver() ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ видСоустройство (Ссли ΠΈΡ… нСсколько). Она ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совпадаСт со стандартной вСрсиСй, создаваСмой AppWizard, ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ мСню ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ². Ѐункция SelectInitialDisplayMode() Π·Π°Π΄Π°Π΅Ρ‚ исходный Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ, устанавливаСмый ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π—Π΄Π΅ΡΡŒ снова ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стандартная вСрсия AppWizard, которая ΠΈΡ‰Π΅Ρ‚ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ 640x480x16.

Ѐункция CreateCustomSurfaces() вызываСтся DirectDrawWin ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°; ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ для создания ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ повСрхностСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Switch. Ѐункция DrawScene() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ экрана; ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для отобраТСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ значСния FPS. НаконСц, функция RestoreSurfaces() вызываСтся классом DirectDrawWin ΠΏΡ€ΠΈ нСобходимости Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ потСрянныС повСрхности. Π­Ρ‚Π° функция восстанавливаСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сами повСрхности, Π½ΠΎ ΠΈ (для особо Π²Π°ΠΆΠ½Ρ‹Ρ… повСрхностСй) ΠΈΡ… содСрТимоС.

Π—Π°Ρ‚Π΅ΠΌ класс SwitchWin ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, спСцифичСскиС для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Switch:

β€’ CreateMenuSurface()

β€’ UpdateMenuSurface()

β€’ CreateFPSSurface()

β€’ UpdateFPSSurface()

Π­Ρ‚ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с повСрхностями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для Π²Ρ‹Π²ΠΎΠ΄Π° мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ значСния FPS. Они ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΠΈΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅.

Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для отобраТСния Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ, мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ FPS, Π° Ρ‚Π°ΠΊΠΆΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со ΡˆΡ€ΠΈΡ„Ρ‚Π°ΠΌΠΈ срСдствами Win32.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ bmpsurf β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° интСрфСйс DirectDrawSurface, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ растра, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ x, y, xinc ΠΈ yinc ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ menusurf ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для доступа ΠΊ повСрхности мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ², Π° Π² Ρ†Π΅Π»ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ selectmode хранится индСкс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ списка связаны с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ значСния FPS. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ fpssurf β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° интСрфСйс DirectDrawSurface, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ производится доступ ΠΊ повСрхности FPS. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ‚ΠΈΠΏΠ° RECT (fpsrect) содСрТит Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ повСрхности fpssurf. ЛогичСская пСрСмСнная displayfps управляСт ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ значСния FPS, Π° Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ framecount хранится количСство ΠΊΠ°Π΄Ρ€ΠΎΠ², Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π΅ измСрСния FPS.

Π”Π²Π΅ послСдниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, smallfont ΠΈ largefont, ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ HFONT. Π­Ρ‚ΠΎ логичСскиС Π½ΠΎΠΌΠ΅Ρ€Π° ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² Win32, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Π²Ρ‹Π²ΠΎΠ΄Π° тСкста Π½Π° повСрхностях menusurf ΠΈ fpssurf.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ прилоТСния

НашС знакомство с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Switch начинаСтся с конструктора switchWin, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ происходит ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса. НС слСдуСт ΠΏΡƒΡ‚Π°Ρ‚ΡŒ эту ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с Ρ‚ΠΎΠΉ, Ρ‡Ρ‚ΠΎ выполняСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateCustomSurfaces(), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ конструктора CreateCustomSurfaces() вызываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ смСнС Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ выглядит Ρ‚Π°ΠΊ

SwitchWin::SwitchWin(){

 bmpsurf=0;

 x=y=0;

 xinc=8;

 yinc=1;

 menusurf=0;

 fpssurf=0;

 vlargefont = CreateFont(28, 0, 0, 0,    FW_NORMAL, FALSE, FALSE, FALSE,   ANSI_CHARSET,    OUT_DEFAULT_PRECIS,   CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,   VARIABLE_PITCH,    "Arial");

 smallfont = CreateFont(14, 0, 0, 0,    FW_NORMAL, FALSE, FALSE, FALSE,   ANSI_CHARSET,    OUT_DEFAULT_PRECIS,   CLIP_DEFAULT_PRECIS,    DEFAULT_QUALITY,   VARIABLE_PITCH,    "Arial");

}

Π’ основном конструктор просто обнуляСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π”Π²Π° логичСских Π½ΠΎΠΌΠ΅Ρ€Π° ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Win32 CreateFont(). Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΡˆΡ€ΠΈΡ„Ρ‚Π°: ΠΊΡ€ΡƒΠΏΠ½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ выводится Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π½Π° повСрхности мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ², Π° ΠΌΠ΅Π»ΠΊΠΈΠΌ β€” описания Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ тСкст со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ FPS.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ SwitchWin Π±ΡƒΠ΄Π΅Ρ‚ создан, DirectDrawWin Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectDriver() ΠΈ SelectInitialDisplayMode(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Switch ΠΎΠ±Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Π΄ΡƒΡ‚ сСбя стандартным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (ΠΊΠ°ΠΊ описано Π² Π³Π»Π°Π²Π΅ 3), ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡ… Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ.

Π—Π°Ρ‚Π΅ΠΌ класс DirectDrawWin Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SwitchWin::CreateCustomSurfaces(), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ повСрхности, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Switch:

BOOL SwitchWin::CreateCustomSurfaces() {

 int displaydepth=GetCurDisplayDepth();

 CString filename;

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

 else filename="tri24.bmp";

 bmpsurf=CreateSurface(filename, TRUE);

 if (bmpsurf==0) {

  TRACE("surface creation failed\n");

  return FALSE;

 }

 selectmode=GetCurDisplayMode();

 CreateMenuSurface();

 UpdateMenuSurface();

 CreateFPSSurface();

 return TRUE;

}

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих Ρ‚Ρ€Π΅Ρ… повСрхностСй опрСдСляСтся BMP-Ρ„Π°ΠΉΠ»ΠΎΠΌ. Ѐункция CreateCustomSurfaces() ΠΏΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Π΅ пиксСлСй опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π΄Π²ΡƒΡ… BMP-Ρ„Π°ΠΉΠ»ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π—Π°Ρ‚Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ (bmpsurf) инициализируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DirectDrawWin::CreateSurface(). Π’ случаС 8-Π±ΠΈΡ‚Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ° содСрТимоС ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ DirectDraw опрСдСляСтся ΠΏΠ°Π»ΠΈΡ‚Ρ€ΠΎΠΉ ΠΈΠ· BMP-Ρ„Π°ΠΉΠ»Π°.

Π—Π°Ρ‚Π΅ΠΌ происходит инициализация самой повСрхности ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, связанных с Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠΌ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ selectmode присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, зависящСС ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выдСлСния Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ° Π² мСню. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ мСню Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² (menusurf) инициализируСтся Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateMenuSurface() ΠΈ UpdateMenuSurface().

НаконСц, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ повСрхности FPS ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Create FPSSurface(). ΠœΡ‹ рассмотрим Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π΅, послС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateMenuSurface() ΠΈ UpdateMenuSurface().

Ѐункция CreateMenuSurface() выглядит Ρ‚Π°ΠΊ:

BOOL SwitchWin::CreateMenuSurface() {

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

 menusurf=CreateSurface(menuwidth, menuheight);

 if (menusurf==0) Fatal("SwitchWin::CreateMenuSurface() failed\n");

 DDCOLORKEY ddck;

 ddck.dwColorSpaceLowValue = 0;

 ddck.dwColorSpaceHighValue = 0;

 menusurf->SetColorKey(DDCKEY_SRCBLT, &ddck);

 return TRUE;

}

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго CreateMenuSurface() освобоТдаСт Π»ΡŽΠ±Ρ‹Π΅ повСрхности, созданныС Ρ€Π°Π½Π΅Π΅. Новая ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ создаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateSurface(). Доступ ΠΊ Π½Π΅ΠΉ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ menusurf. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠΉ повСрхности Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΠ»ΡŽΡ‡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры DDCOLORKEY ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetColorKey() интСрфСйса DirectDrawSurface.

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

ΠœΡ‹ Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΊΠ»ΡŽΡ‡ повСрхности мСню с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры DDCOLORKEY ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetColorKey(). Оба поля DDCOLORKEY ΠΎΠ±Π½ΡƒΠ»ΡΡŽΡ‚ΡΡ (Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π½ΠΎ Π² нашСм случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ всСго ΠΎΠ΄ΠΈΠ½ Ρ†Π²Π΅Ρ‚). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ пиксСли повСрхности, Ρ€Π°Π²Π½Ρ‹Π΅ Π½ΡƒΠ»ΡŽ, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π±Π»ΠΈΡ‚-опСрациях с Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ мСню Π±ΡƒΠ΄Π΅Ρ‚ создана Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateMenuSurface(), ΠΎΠ½Π° заполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ UpdateMenuSurface(). Π’Π½ΡƒΡ‚Ρ€ΠΈ послСднСй для Π²Ρ‹Π²ΠΎΠ΄Π° тСкста Π½Π° ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ функция GetDC() интСрфСйса DirectDrawSurface ΠΈ тСкстовыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Win32. Ѐункция UpdateMenuSurface() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 4.3.


Листинг 4.3. Ѐункция SwitchWin::UpdateMenuSurface()

BOOL SwitchWin::UpdateMenuSurface() {

 char buf[40];

 int len;

 int hdrlen=strlen(headertext);

 ClearSurface(menusurf, 0);

 HDC hdc;

 menusurf->GetDC(&hdc);

 SelectObject(hdc, largefont);

 SetBkMode(hdc, TRANSPARENT);