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

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

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

Π—Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ LoadAvi() ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ функция DrawScene(). ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Сю для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°Π΄Ρ€ΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠ°. Помимо извлСчСния ΠΈ восстановлСния ΠΊΠ°Π΄Ρ€ΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ° DrawScene() осущСствляСт Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ страниц, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для отобраТСния ΠΊΠ°Π΄Ρ€Π°.

Ѐункция RestoreSurfaces() ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° восстановлСниС повСрхностСй, хранящихся Π² видСопамяти, Π² случаС ΠΈΡ… ΠΏΠΎΡ‚Π΅Ρ€ΠΈ. Как Π²Ρ‹ вскорС ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ эта функция выглядит ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateAviSurface() ΠΈ UpdateAviSurface() ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° созданиС ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ повСрхности AVI. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ повСрхности AVI ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΊΠ°Π΄Ρ€ΠΎΠ² AVI-Ρ„Π°ΠΉΠ»Π°, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, поэтому ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ AVI-Ρ„Π°ΠΉΠ»Π° создаСтся новая ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ AVI. Ѐункция UpdateAviSurface() Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ AVI ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ, копируя Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ICDecompress() Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ повСрхности.

ПослСднСй объявлСна функция InstallPalette(), которая устанавливаСт ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ AVI ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ воспроизвСдСния Ρ€ΠΎΠ»ΠΈΠΊΠ°. Однако ΠΏΠ΅Ρ€Π΅Π΄ этим ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° AVI.

ΠžΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Ρ‡Π°ΡΡ‚ΡŒ класса содСрТит лишь ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. ΠœΡ‹ познакомимся с Π½ΠΈΠΌΠΈ Π²ΠΎ врСмя рассмотрСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Ѐункция OnCreate() 

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² порядкС ΠΈΡ… выполнСния. НачнСм с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OnCreate(), которая выглядит Ρ‚Π°ΠΊ:

int AviPlayWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 if (DirectDrawWin::OnCreate(lpCreateStruct) == -1) return -1;

 AVIFileInit();

 ShowDialog();

 return 0;

}

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π²Π΅Ρ€ΡΠΈΡŽ OnCreate() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса (Π° ΠΎΠ½Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ DirectDraw). Если Π²Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ закончится Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ бСссмыслСнно, ΠΈ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΠΊΠΎΠ΄ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ –1.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ AVIFileInit(), которая ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Video For Windows. ПослС этого ΠΌΠΎΠΆΠ½ΠΎ спокойно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями VFW.

НаконСц, функция ShowDialog() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° AVI-Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Однако ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ShowDialog(), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ SelectInitialDisplayMode(), которая вызываСтся ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ OnCreate() класса DirectDrawWin.

Ѐункция SelectInitialDisplayMode() 

Как ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, функция SelectInitialDisplayMode() Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ. Она выглядит Ρ‚Π°ΠΊ:

int AviPlayWin::SelectInitialDisplayMode() {

 GetSystemPalette();

 int i, nummodes=GetNumDisplayModes();

 DWORD w,h,d;

 for (i=0;i<nummodes;i++) {

  DisplayModeDescription desc;

  GetDisplayModeDimensions(i, w, h, d);

  if (d==8) {

   desc.w=w;

   desc.h=h;

   desc.d=d;

   desc.desc.Format("%dx%d", w, h);

   displaymode.Add(desc);

  }

 }

 int curdepth=GetDisplayDepth();

 if (curdepth!=8) ddraw2->SetDisplayMode(640, 480, curdepth, 0, 0);

 for (i=0;i<nummodes;i++) {

  GetDisplayModeDimensions(i, w, h, d);

  if (w==640 && h==480 && d==8) return i;

 }

 return 1;

}

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свою ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ (Π²Ρ‹Π±ΠΎΡ€ исходного Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°), функция SelectInitialDisplayMode() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ GetSystemPalette(). Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ GetSystemPalette() создаСт ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ DirectDraw Π½Π° Π±Π°Π·Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ Windows. Π­Ρ‚Π° ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° обСспСчиваСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° Π±Ρ‹Π»Π° установлСна для воспроизвСдСния Ρ€ΠΎΠ»ΠΈΠΊΠ°. ВспомнитС β€” GDI Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ DirectDraw ΠΈ поэтому всСгда пытаСтся вывСсти Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с использованиСм систСмной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° DirectDraw.

Π—Π°Ρ‚Π΅ΠΌ функция SelectInitialDisplayMode() ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ список доступных Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΈ сохраняСт описания 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Π² массивС displaymodes. ПозднСС этот массив пСрСдаСтся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌΡƒ ΠΎΠΊΠ½Ρƒ для Π²Ρ‹Π²ΠΎΠ΄Π° списка доступных Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ².

НаконСц, функция ΠΈΡ‰Π΅Ρ‚ 8-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ 640x480. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ Π²Ρ‹Π±Ρ€Π°Π½ лишь ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ поддСрТиваСтся Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎΠΌ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ (Ссли Π½Π΅ всСми). ПослС Π²Ρ‹Π²ΠΎΠ΄Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ 8-Π±ΠΈΡ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ.

Ѐункция ShowDialog() 

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π²Ρ‹Π²ΠΎΠ΄Π° Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Ѐункция ShowDialog() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 8.2.


Листинг 8.2. Ѐункция ShowDialog()

void AviPlayWin::ShowDialog() {

 const CRect& displayrect=GetDisplayRect();

 if (displayrect.Width()<640 || displayrect.Height()>480) ddraw2->SetDisplayMode(640, 480, 8, 0, 0);

 ClearSurface(backsurf, 0);

 ClearSurface(primsurf, 0);

 primsurf->SetPalette(syspal);

 ddraw2->FlipToGDISurface();

 ShowCursor(TRUE);

 if (avidialog==0) {

  avidialog=new AviDialog();

  avidialog->SetArray(&displaymode);

 }

 if (avistream)  AVIStreamRelease(avistream), avistream=0;

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

  PostMessage(WM_CLOSE);

  return;

 }

 ShowCursor(FALSE);

 fullfilename=avidialog->fullfilename;

 filename=avidialog->filename;

 pathname=avidialog->pathname;

 int index=avidialog->GetIndex();

 DWORD w,h,d;

 w=displaymode[index].w;

 h=displaymode[index].h;

 d=displaymode[index].d;

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

 LoadAvi();

 CreateAviSurface();

 InstallPalette();

 curframe=startframe;

}

Ѐункция ShowDialog() начинаСтся с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Если Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ установлСн Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ мСньшС 640x480, ΠΎΠ½ измСняСтся. Π­Ρ‚ΠΎ сдСлано для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Mode X. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот Ρ€Π΅ΠΆΠΈΠΌ Π½Π΅ поддСрТиваСтся Windows, такая ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°, скорСС всСго, закончится Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ ΠΈΠ·-Π·Π° Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ пиксСлСй Π² Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… Mode X.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊ вопрос β€” Π° ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Mode X? ВспомнитС, Ρ‡Ρ‚ΠΎ эта функция вызываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ клавиши Escape, ΠΏΡ€ΠΎΠ±Π΅Π»Π° ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π²ΠΎ врСмя воспроизвСдСния Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠ°. НСльзя ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ Mode X Π±Ρ‹Π» установлСн для воспроизвСдСния Ρ€ΠΎΠ»ΠΈΠΊΠ°, поэтому ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ эту Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ.

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

ПослС установки систСмной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DirectDraw FlipToGDISurface(). Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Windows Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ повСрхности, Π° Π½Π΅ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ снова Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ курсор ΠΌΡ‹ΡˆΠΈ (ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ смоТСт Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ AVI-Ρ„Π°ΠΉΠ»).

Если экзСмпляр класса AviDialog Π½Π΅ Π±Ρ‹Π» создан ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ShowDialog(), ΠΌΡ‹ создаСм Π΅Π³ΠΎ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ создании Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π΅ΠΌΡƒ пСрСдаСтся массив 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ², ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectInitialDisplayMode().

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ AVI-ΠΏΠΎΡ‚ΠΎΠΊ. Π­Ρ‚ΠΎ дСлаСтся ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ класс AviDialog ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ собствСнными срСдствами для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΈ количСство ΠΊΠ°Π΄Ρ€ΠΎΠ² Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ AVI-Ρ„Π°ΠΉΠ»Π΅. Если Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ‚ΠΎ ΠΏΡ€ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ Π²Ρ‹Π±ΠΎΡ€Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΡƒΠΆΠ΅ Π½Π΅ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Ѐункция DoModal() ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Cancel ΠΌΡ‹ посылаСм сообщСниС WM_CLOSE. Если всС ΠΈΠ΄Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ имя Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (Π² Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ…) вмСстС с индСксом Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ° (Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄ΠΎ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ Play). Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ°, взятыС ΠΈΠ· массива displaymode, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetDisplayMode().

Π”Π°Π»ΡŒΡˆΠ΅ слСдуСт Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadAvi(). Как Π²Ρ‹ вскорС ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, функция LoadAvi() Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊ β€” ΠΎΠ½Π° лишь ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ свСдСния ΠΎ Ρ€ΠΎΠ»ΠΈΠΊΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, количСство ΠΊΠ°Π΄Ρ€ΠΎΠ² ΠΈ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹). Ѐункция CreateAviSurface() ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌ создаСт ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ для хранСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π° Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°.

Ѐункция InstallPalette() ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹ ΠΈΠ· AVI-Ρ„Π°ΠΉΠ»Π° ΠΈ строит ΠΏΠΎ Π½ΠΈΠΌ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ DirectDraw, которая Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для просмотра. НаконСц, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curframe, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° ΠΊΠ°Π΄Ρ€ΠΎΠ², присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ startframe.

Ѐункция LoadAvi() 

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая нСпосрСдствСнно ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ AVI-Ρ„Π°ΠΉΠ». Ѐункция LoadAvi() ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 8.3.


Листинг 8.3. Ѐункция LoadAvi()

BOOL AviPlayWin::LoadAvi() {

 long r;

 CWaitCursor cur;

 if (avistream) AVIStreamRelease(avistream), avistream=0;

 r=AVIStreamOpenFromFile(&avistream, filename, streamtypeVIDEO, 0, OF_READ | OF_SHARE_EXCLUSIVE, 0);

 TRACE("AVIStreamOpenFromFile: %s\n", r==0 ? "OK" : "failed");

 r=AVIStreamFormatSize(avistream, 0, &fmtlen);

 TRACE("AVIStreamFormatSize: %s\n", r==0 ? "OK" : "failed");