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

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

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

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

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

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

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° прилоТСния

По своСй структурС оконная вСрсия прилоТСния Bounce ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ отличаСтся ΠΎΡ‚ полноэкранной. Как ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅, классы DirectDrawWin ΠΈ DirectDrawApp ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ DirectDraw ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… для классов, относящихся ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ прилоТСниям.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

Π’ полноэкранном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ класса DirectDrawWin функция OnCreate() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ DirectDraw Π·Π° нСсколько этапов. ΠžΠΊΠΎΠ½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ выглядит ΠΏΡ€ΠΎΡ‰Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½Π΅ приходится ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ DirectDraw ΠΈΠ»ΠΈ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΡ‹. Оконная вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OnCreate() выглядит Ρ‚Π°ΠΊ:

int DirectDrawWin::OnCreate(LPCREATESTRUCT) {

 LPDIRECTDRAW ddraw1;

 DirectDrawCreate(0, &ddraw1, 0);

 ddraw1->QueryInterface(IID_IDirectDraw2, (void**)&ddraw2);  ddraw1->Release(), ddraw1=0;  ddraw2->SetCooperativeLevel(GetSafeHwnd(), DDSCL_NORMAL);

 DetectDisplayMode();

 if (CreateFlippingSurfaces()==FALSE) {

  AfxMessageBox("CreateFlippingSurfaces() failed");

  return FALSE;

 }

 if (CreateCustomSurfaces()==FALSE) {

  AfxMessageBox("CreateCustomSurfaces() failed");

  return FALSE;

 }

 return 0;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° интСрфСйс DirectDraw(ddraw1) инициализируСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ DirectDrawCreate(). Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ddraw1, ΠΊΠ°ΠΊ ΠΈ Π² полноэкранной вСрсии, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для получСния указатСля Π½Π° интСрфСйс DirectDraw2, послС Ρ‡Π΅Π³ΠΎ освобоТдаСтся.

Π—Π°Ρ‚Π΅ΠΌ функция OnCreate() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SetCooperativeLevel(). Π’ полноэкранном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ опрСдСлялся трСмя Ρ„Π»Π°Π³Π°ΠΌΠΈ: DDSCL_EXCLUSIVE, DDSCL_FULLSCREEN ΠΈ DDSCL_ALLOWMODEX. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π»Π°Π³ DDSCL_NORMAL.

Ѐункция DetectDisplayMode() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ класса DirectDrawWin. Она выглядит Ρ‚Π°ΠΊ:

BOOL DirectDrawWin::DetectDisplayMode() {

 DDSURFACEDESC desc;

 ZeroMemory(&desc, sizeof(desc));

 desc.dwSize=sizeof(desc);

 if (ddraw2->GetDisplayMode(&desc)!=DD_OK) {

  TRACE("GetDisplayMode() failed\n");

  return FALSE;

 }

 displayrect.left=0;

 displayrect.top=0;

 displayrect.right=desc.dwWidth;

 displayrect.bottom=desc.dwHeight;

 displaydepth=desc.ddpfPixelFormat.dwRGBBitCount;

 return TRUE;

}

Ѐункция DetectDisplayMode() с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetDisplayMode() интСрфСйса DirectDraw ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ΅ Windows. Говоря Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ экрана ΠΈ Π³Π»ΡƒΠ±ΠΈΠ½Π° пиксСлСй Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ° ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… displayrect ΠΈ displaydepth.

Π”Π°Π»Π΅Π΅ OnCreate() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateFlippingSurfaces(). Π₯отя ΠΎΠΊΠΎΠ½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ настоящСго ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ страниц (ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, исходя ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), имя Π±Ρ‹Π»ΠΎ сохранСно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ создаваСмыС Π² Π½Π΅ΠΉ повСрхности ΡΠΌΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц. Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 3.4.


Листинг 3.4. Ѐункция CreateFlippingSurfaces() Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

BOOL DirectDrawWin::CreateFlippingSurfaces() {

 HRESULT r;

 DDSURFACEDESC desc;

 desc.dwSize = sizeof(desc);

 desc.dwFlags = DDSD_CAPS;

 desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

 r=ddraw2->CreateSurface(&desc, &primsurf, 0);

 if (r!=DD_OK) {

  TRACE("FAILED to create 'primsurf'\n");

  return FALSE;

 }

 r=ddraw2->CreateClipper(0, &clipper, 0);

 if (r!=DD_OK) {

  TRACE("CreateClipper() failed\n");

  return FALSE;

 }

 r=clipper->SetHWnd(0, GetSafeHwnd());

 if (r!=DD_OK) {

  TRACE("SetHWnd() failed\n");

  return FALSE;

 }

 r=primsurf->SetClipper(clipper);

 if (r!=DD_OK) {

  TRACE("SetClipper() failed\n");

  return FALSE;

 }

 ZeroMemory(&desc, sizeof(desc));

 desc.dwSize = sizeof(desc);

 desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;

 desc.dwWidth = displayrect.Width();

 desc.dwHeight = displayrect.Height();

 desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

 r=ddraw2->CreateSurface(&desc, &backsurf, 0);

 if (r!=DD_OK) {

  TRACE("failed to create 'backsurf' in video\n");

  videobacksurf=FALSE;

 } else {

  TRACE("Created backsurf in video\n");

  videobacksurf=TRUE;

 }

 return TRUE;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ создаСм ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. Π’ полноэкранном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΊΠΎΠ΄ выглядит ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ здСсь создаСтся обычная, нСсоставная пСрвичная ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. Π’ структурС DDSURFACEDESC ΠΌΡ‹ описываСм ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π»Π°Π³ DDSCAPS_PRIMARYSURFACE. Π—Π°Ρ‚Π΅ΠΌ описанная ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ создаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CreateSurface() интСрфСйса DirectDraw.

Π”Π°Π»Π΅Π΅ функция CreateClipper() интСрфСйса DirectDraw создаСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния. CreateClipper() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈ послСдний ΠΈΠ· Π½ΠΈΡ… Ρ‡Π°Ρ‰Π΅ всСго Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой адрСс указатСля Π½Π° интСрфСйс DirectDrawClipper. Π’ нашСм случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ пСрСмСнная класса DirectDrawWin с ΠΈΠΌΠ΅Π½Π΅ΠΌ clipper.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния Π½ΡƒΠΆΠ΅Π½ для ограничСния Π²Ρ‹Π²ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΠΊΠ½Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ находится Π½Π° Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ столС вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠΊΠ½Π°ΠΌΠΈ, ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ изобраТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ присутствиС этих ΠΎΠΊΠΎΠ½. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния автоматичСски выполнял свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΊ ΠΎΠΊΠ½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetHWnd() интСрфСйса DirectDrawClipper. Ѐункция SetHWnd() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° β€” Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово (DWORD), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ использования ΠΈ ΠΏΠΎΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ, ΠΈ логичСский Π½ΠΎΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° прилоТСния.

Π”Π°Π»Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния присоСдиняСтся ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности прилоТСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SetClipper() интСрфСйса DirectDrawSurface. ПослС Ρ‚Π°ΠΊΠΎΠ³ΠΎ присоСдинСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³ Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Blt() интСрфСйса DirectDrawSurface. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ BltFast() нСльзя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ отсСчСния.

ПослСднСС, Ρ‡Ρ‚ΠΎ происходит Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateFlippingSurface(),  - созданиС повСрхности Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. Π’ идСальном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Π½Π°ΠΌ удастся Π½Π°ΠΉΡ‚ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ Π²ΠΈΠ΄Π΅ΠΎΠΏΠ°ΠΌΡΡ‚ΡŒ Π² объСмС, достаточном для создания внСэкранной повСрхности, которая ΠΏΠΎ ΡˆΠΈΡ€ΠΈΠ½Π΅ ΠΈ высотС совпадаСт с ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒΡŽ. Π― Π½Π°Π·Ρ‹Π²Π°ΡŽ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ·-Π·Π° прСимущСства ΠΏΠΎ скорости, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ для Π±Π»ΠΈΡ‚-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… видСопамяти. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ совпадаСт с ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΎΠ½ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для ΠΎΠΊΠ½Π° любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Ѐункция CreateFlippingSurfaces() пытаСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Β«ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉΒ» Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ DDSCAPS_VIDEOMEMORY ΠΈ функция CreateSurface(). Если Π²Ρ‹Π·ΠΎΠ² заканчиваСтся ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ„Π»Π°Π³ videobacksurf ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE, Π° функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ Π½Π΅ создаСтся, Π° Ρ„Π»Π°Π³Ρƒ videobacksurf присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE.

Π’ Ρ‚ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ создаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² систСмной памяти ΠΏΠΎΠ·Π΄Π½Π΅Π΅, Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnSize(). Ѐункция OnSize() вызываСтся ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π° прилоТСния. Боздавая Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ клиСнтской области ΠΎΠΊΠ½Π°, ΠΌΡ‹ экономим ΠΏΠ°ΠΌΡΡ‚ΡŒ. Ѐункция OnSize() выглядит Ρ‚Π°ΠΊ:

void DirectDrawWin::OnSize(UINT nType, int cx, int cy) {

 CWnd::OnSize(nType, cx, cy);

 CFrameWnd::GetClientRect(&clientrect);

 CFrameWnd::ClientToScreen(&clientrect);

 if (videobacksurf) return;

 DDSURFACEDESC desc;

 ZeroMemory(&desc, sizeof(desc));

 desc.dwSize = sizeof(desc);

 desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;

 desc.dwWidth = clientrect.Width();

 desc.dwHeight = clientrect.Height();

 desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;

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

 HRESULT r=ddraw2->CreateSurface(&desc, &backsurf, 0);

 if (r!=DD_OK)  {

  TRACE("failed to create 'backsurf'\n");

  return;

 } else TRACE("backsurf w=%d h=%d\n", clientrect.Width(), clientrect.Height());