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

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

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

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляры всСх основных классов прилоТСния. Π’ нашСм случаС это Π±ΡƒΠ΄ΡƒΡ‚ классы BounceWin ΠΈ BounceApp. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ прилоТСния создаСтся способом, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ для MFC, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ объявлСниСм глобального экзСмпляра:

BounceApp theapp;

Класс BounceApp наслСдуСт свои Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΎΡ‚ DirectDrawApp, ΠΈ большС Π΅ΠΌΡƒ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ трСбуСтся. Π•ΡΡ‚ΡŒ всСго ΠΎΠ΄Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: класс BounceApp ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° BounceWin. Π­Ρ‚ΠΎ происходит Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ InitInstance(), Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ MFC ΠΏΡ€ΠΈ запускС прилоТСния. Ѐункция InitInstance() выглядит Ρ‚Π°ΠΊ:

BOOL BounceApp::InitInstance() {

 BounceWin* win=new BounceWin;

 if (!win->Create("High Performance Bounce Demo", IDI_ICON)) {

  AfxMessageBox("Failed to create window");

  return FALSE;

 }

 m_pMainWnd=win;

 return DirectDrawApp::InitInstance();

}

Ѐункция InitInstance() создаСт экзСмпляр класса BounceWin ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ BounceWin::Create(). ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Create() Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: строку с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΊΠ½Π° ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ рСсурса Π·Π½Π°Ρ‡ΠΊΠ°. Π₯отя Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π½Π΅ отобраТаСтся Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ вСсь экран ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ строки Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°), ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² спискС Π·Π°Π΄Π°Ρ‡, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈ сворачивании прилоТСния. Если Π²Ρ‹Π·ΠΎΠ² Create() закончится Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, Ρ‚ΠΎ функция InitInstance() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ FALSE. По этому ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΡƒ MFC ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ слСдуСт Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ.

Π—Π°Ρ‚Π΅ΠΌ пСрСмСнная m_pMainWnd инициализируСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° созданный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΊΠ½Π°. Π­Ρ‚Π° пСрСмСнная ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу CWinApp; инициализируя Π΅Π΅, Π²Ρ‹ сообщаСтС классу CWinApp ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ ΠΎΠΊΠ½Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ. Если m_pMainWnd Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ присвоСн ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠΊΠ½ΠΎ, MFC Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ошибкой.

НаконСц, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DirectDrawApp:InitInstance() ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΎΡ‚ Π½Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BounceApp::InitInstance(). Ѐункция InitInstance() класса DirectDrawApp выглядит Ρ‚Π°ΠΊ:

BOOL DirectDrawApp::InitInstance() {

 ASSERT(m_pMainWnd);

 m_pMainWnd->ShowWindow(SW_SHOWNORMAL);

 m_pMainWnd->UpdateWindow();

 ShowCursor(FALSE);

 return TRUE;

}

Π― ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π» ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ MFC Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ m_pMainWnd, Π½ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ m_pMainWnd ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠœΠ°ΠΊΡ€ΠΎΡ MFC ASSERT() провСряСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ m_pMainWnd. Если ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ошибкой. Если ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ нуля, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ созданного ΠΎΠΊΠ½Π°: ShowWindow() ΠΈ UpdateWindow(). Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ ΠΎΠΊΠ½ΠΎ Π½Π° экранС. НаконСц, функция ShowCursor() ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ курсор ΠΌΡ‹ΡˆΠΈ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ процСсс ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ классов DirectDrawApp ΠΈ BounceApp. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ этот процСсс отраТаСтся Π½Π° классах DirectDrawWin ΠΈ BounceWin.

Как ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, функция Create() вызываСтся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ BounceApp:: InitInstance(). Она Π½Π΅ рСализуСтся классом BounceWin, Π° наслСдуСтся ΠΎΡ‚ DirectDrawWin. Ѐункция Create() выглядит Ρ‚Π°ΠΊ:

BOOL DirectDrawWin::Create(const CString& title,int icon) {

 CString sClassName;

 sClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,   LoadCursor(0, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1),   LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(icon)));

 return CWnd::CreateEx(WS_EX_TOPMOST, sClassName, title, WS_POPUP, 0, 0, 100, 100, 0, 0);

}

Π‘Π½Π°Ρ‡Π°Π»Π° функция Create() рСгистрируСт класс ΠΎΠΊΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AfxRegisterWndClass(). Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateEx(), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈ происходит фактичСскоС созданиС ΠΎΠΊΠ½Π°.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ создаваСмоС ΠΎΠΊΠ½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ 100x100 (сСдьмой ΠΈ восьмой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ CreateEx()). Π’Π°ΠΊΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ. DirectDraw ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΎΠΊΠ½Π° автоматичСски измСняСт Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π·Π°Π½ΠΈΠΌΠ°Π»ΠΎ вСсь экран. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„Π»Π°Π³ WS_EX_TOPMOST: ΠΎΠΊΠ½ΠΎ полноэкранного прилоТСния DirectDraw Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½.

Атрибут Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ ΠΎΠΊΠ½Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ занятиС ΠΈΠΌ всСго экрана Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ GDI Π½Π΅ смог Π½ΠΈΡ‡Π΅Π³ΠΎ вывСсти Π½Π° экран. GDI Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ DirectDraw, поэтому нашС ΠΎΠΊΠ½ΠΎ Β«ΠΎΠ±ΠΌΠ°Π½Ρ‹Π²Π°Π΅Ρ‚Β» GDI Π½Π° Ρ‚ΠΎ врСмя, ΠΏΠΎΠΊΠ° вСсь экран находится ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ DirectDraw. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Π²Ρ‹Π²ΠΎΠ΄ срСдствами GDI ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈ Π² полноэкранном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π½Π΅ рСкомСндуСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ GDI ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π½Π° Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ. Π­Ρ‚Π° Ρ‚Π΅ΠΌΠ° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСтся Π² Π³Π»Π°Π²Π΅ 5.

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

ЀактичСскоС созданиС ΠΎΠΊΠ½Π° (Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateEx()) заставляСт Windows ΠΏΠΎΡΠ»Π°Ρ‚ΡŒ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сообщСниС WM_CREATE. Класс DirectDrawWin ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ это сообщСниС Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnCreate(), созданном ClassWizard (см. листинг 3.1).


Листинг 3.1. Ѐункция DirectDrawWin::OnCreate()

int DirectDrawWin::OnCreate(LPCREATESTRUCT) {

 DirectDrawEnumerate(DriverAvailable, this);

 if (totaldrivers==0) {

  AfxMessageBox("No DirectDraw drivers detected");

  return -1;

 }

 int driverindex=SelectDriver();

 if (driverindex<0) {

  TRACE("No DirectDraw driver selected\n");

  return -1;

 } else if (driverindex>totaldrivers-1) {

  AfxMessageBox("Invalid DirectDraw driver selected\n");

  return -1;

 }

 LPDIRECTDRAW ddraw1;

 DirectDrawCreate(driver[driverindex].guid, &ddraw1, 0);

 HRESULT r;

 r=ddraw1->QueryInterface(IID_IDirectDraw2, (void**)&ddraw2);

 if (r!=S_OK) {

  AfxMessageBox("DirectDraw2 interface not supported");

  return -1;

 }

 ddraw1->Release(), ddraw1=0;

 ddraw2->SetCooperativeLevel(GetSafeHwnd(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX);

 ddraw2->EnumDisplayModes(0, 0, this, DisplayModeAvailable);

 qsort(displaymode, totaldisplaymodes, sizeof(DisplayModeInfo),   CompareModes);

 int initmode=SelectInitialDisplayMode();

 if (ActivateDisplayMode(initmode)==FALSE) return -1;

 return 0;

}

Вся инициализация DirectDraw выполняСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OnCreate() (ΠΏΡ€ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ). ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ состоит ΠΈΠ· сСми этапов:

β€’ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка всСх Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² DirectDraw.

β€’ Π’Ρ‹Π±ΠΎΡ€ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° DirectDraw.

β€’ Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ DirectDraw с использованиСм Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°.

β€’ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ².

β€’ Π’Ρ‹Π±ΠΎΡ€ исходного Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°.

β€’ Активизация Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°.

β€’ Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ повСрхностСй прилоТСния.

ВсС эти этапы Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ….

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² DirectDraw

Ѐункция DirectDrawEnumerate() ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для составлСния списка доступных Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² DirectDraw. Π§Π°Ρ‰Π΅ всСго обнаруТиваСтся всСго ΠΎΠ΄ΠΈΠ½ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ DirectDraw β€” Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт установлСнной Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ΠΎΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… конфигурациях ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ нСсколько видСоустройств. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях DirectDrawEnumerate() ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ видСоустройства, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ DirectDraw.

Ѐункция DirectDrawEnumerate() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° косвСнно Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ (callback) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, опрСдСляСмыС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅. Π’ нашСм случаС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ косвСнно вызываСмая функция DriverAvailable() ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс DirectDrawWin (this). Ѐункция DriverAvailable() опрСдСляСтся Ρ‚Π°ΠΊ:

BOOL WINAPI DirectDrawWin::DriverAvailable(LPGUID guid, LPSTR desc, LPSTR name, LPVOID p) {

 DirectDrawWin* win=(DirectDrawWin*)p;

 if (win->totaldrivers >= MAXDRIVERS) return DDENUMRET_CANCEL;

 DriverInfo& info=win->driver[win->totaldrivers];

 if (guid)  {

  info.guid=(GUID*)new BYTE[sizeof(GUID)];

  memcpy(info.guid, guid, sizeof(GUID));

 } else info.guid=0;

 info.desc=strdup(desc);

 info.name=strdup(name);

 win->totaldrivers++;

 return DDENUMRET_OK;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅, опрСдСляСмыС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (p), прСобразуСтся Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° класс DirectDrawWin (win). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция DriverAvailable() объявлСна ΠΊΠ°ΠΊ статичСская (косвСнно Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ обязаны Π±Ρ‹Ρ‚ΡŒ статичСскими), Π½Π° Π½Π΅Π΅ Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса Π½Π΅ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° автоматичСского доступа; соотвСтствСнно доступ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ функциям класса приходится ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ win.

DirectDraw Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DriverAvailable() ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°: GUID, описаниС ΠΈ имя. GUID (глобально-ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€) ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€. ОписаниС ΠΈ имя ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой строки для Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°. Ѐункция DriverAvailable() сохраняСт свСдСния ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π΅ Π² массивС с ΠΈΠΌΠ΅Π½Π΅ΠΌ driver ΠΈ отслСТиваСт количСство Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ totaldrivers. НаконСц, функция DriverAvailable() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ DDNUMRET_OK, показывая, Ρ‡Ρ‚ΠΎ пСрСчислСниС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ. ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° DDENUMRET_CANCEL DirectDraw ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ пСрСчислСниС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ².