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

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

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

typedef struct tagBITMAPINFOHEADER {

 DWORD biSize;

 LONG  biWidth;

 LONG  biHeight;

 WORD  biPlanes;

 WORD  biBitCount;

 DWORD biCompression;

 DWORD biSizeImage;

 LONG  biXPelsPerMeter;

 LONG  biYPelsPerMeter;

 DWORD biClrUsed;

 DWORD biClrImportant;

} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

НСкоторыС поля структуры (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, biXPelsPerMeter ΠΈ biYPelsPerMeter) Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ AVI-Ρ„Π°ΠΉΠ»Π°ΠΌ, Π½ΠΎ Ρ‚Π°ΠΊΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹, Π³Π»ΡƒΠ±ΠΈΠ½Π° пиксСлСй, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия ΠΈ количСство Ρ†Π²Π΅Ρ‚ΠΎΠ² β€” всС это ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈΠ· структуры BITMAPINFOHEADER послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AVIStreamReadFormat().

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Π΅ свСдСния ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AVIStreamInfo(). Ѐункция AVIStreamInfo(), ΠΊΠ°ΠΊ ΠΈ функция AVIStreamReadFormat(), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° логичСский Π½ΠΎΠΌΠ΅Ρ€ ΠΈ заполняСт структуру Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ AVIStreamInfo() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ структуру AVISTREAMINFO. Π•Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ»Π΅ vfw.h выглядит Ρ‚Π°ΠΊ:

typedef struct _AVISTREAMINFOW {

 DWORD fccType;

 DWORD fccHandler;

 DWORD dwFlags;

 DWORD dwCaps;

 WORD  wPriority;

 WORD  wLanguage;

 DWORD dwScale;

 DWORD dwRate;

 DWORD dwStart;

 DWORD dwLength;

 DWORD dwInitialFrames;

 DWORD dwSuggestedBufferSize;

 DWORD dwQuality;

 DWORD dwSampleSize;

 RECT  rcFrame;

 DWORD dwEditCount;

 DWORD dwFormatChangeCount;

 WCHAR szName[64];

} AVISTREAMINFOW, FAR * LPAVISTREAMINFOW;

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ поля этой структуры. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅, fccType, опрСдСляСт Ρ‚ΠΈΠΏ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’ Ρ„Π°ΠΉΠ»Π°Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° AVI ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…: Π²ΠΈΠ΄Π΅ΠΎ, Π°ΡƒΠ΄ΠΈΠΎ, MIDI (ΠΌΡƒΠ·Ρ‹ΠΊΠ°) ΠΈ тСкст. Π’ этой ΠΊΠ½ΠΈΠ³Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ»Π΅ структуры AVISTREAMINFO, fccHandler, опрСдСляСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ сохранСнии Π²ΠΈΠ΄Π΅ΠΎΠΏΠΎΡ‚ΠΎΠΊΠ°. Как Π²Ρ‹ вскорС ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Video For Windows это ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания «дСкомпрСссоров», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ способны Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сТатый ΠΊΠ°Π΄Ρ€ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ПолС dwStart опрСдСляСт индСкс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° (это Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ индСкс 0 ΠΈΠ»ΠΈ 1). Π­Ρ‚Ρƒ ΠΆΠ΅ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΌΠΎΠΆΠ½ΠΎ нСпосрСдствСнно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ AVIStreamStart().Π’ ΠΏΠΎΠ»Π΅ dwLength хранится ΠΎΠ±Ρ‰Π΅Π΅ количСство ΠΊΠ°Π΄Ρ€ΠΎΠ² Π²ΠΈΠ΄Π΅ΠΎΡ€ΠΎΠ»ΠΈΠΊΠ°. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈΠ· структуры AVISTREAMINFO, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AVIStreamLength().

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

Для восстановлСния ΠΊΠ°Π΄Ρ€ΠΎΠ² примСняСтся функция ICDecompress(). Она ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° Π±ΡƒΡ„Π΅Ρ€Π°: Π² ΠΎΠ΄Π½ΠΎΠΌ находятся сТатыС Π΄Π°Π½Π½Ρ‹Π΅, Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ восстановлСнный ΠΊΠ°Π΄Ρ€. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ICDecompress() Ρ‚Π°ΠΊΠΆΠ΅ слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ логичСский Π½ΠΎΠΌΠ΅Ρ€ дСкомпрСссора, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ICDecompress() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сТатых Π΄Π°Π½Π½Ρ‹Ρ….

ЛогичСский Π½ΠΎΠΌΠ΅Ρ€ дСкомпрСссора ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ICDecompressOpen(). По описанию Π²ΠΈΠ΄Π΅ΠΎΠ΄Π°Π½Π½Ρ‹Ρ… функция ICDecompressOpen() ΠΈΡ‰Π΅Ρ‚ дСкомпрСссор с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° восстановлСния.

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ AVIStreamRelease(). ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ AVIStreamRelease() логичСский Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° становится Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ (Π΄ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ открытия ΠΏΠΎΡ‚ΠΎΠΊΠ°). НаконСц, ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ AVIFileExit(), которая освобоТдаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ VFW. 

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° AviPlay

ΠŸΠΎΡ€Π° Π±Ρ€Π°Ρ‚ΡŒΡΡ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ AviPlay, ΠΊΠ°ΠΊ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, рассматриваСмыС Π² этой ΠΊΠ½ΠΈΠ³Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° CD-ROM.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° AviPlay ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Video For Windows для открытия ΠΈ воспроизвСдСния AVI-Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° повСрхностях DirectDraw. Она позволяСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ любой AVI-Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ для воспроизвСдСния Ρ€ΠΎΠ»ΠΈΠΊΠ°. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ„Π°ΠΉΠ»Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π½Π° рис. 8.1.

Рис. 8.1. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° AVI-Ρ„Π°ΠΉΠ»Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ AviPlay


Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ успСли ΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ AviPlay ΠΈ Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ этого сами, я Ρ…ΠΎΡ‡Ρƒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° нСсколько Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ. НапримСр, ΠΎΠ½Π° Π½Π΅ воспроизводит Π°ΡƒΠ΄ΠΈΠΎΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΠ· Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ AVI-Ρ„Π°ΠΉΠ»Π°, Π° лишь ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈ воспроизводит Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π°.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ пытаСтся ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ частотой Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°Π΄Ρ€ΠΎΠ²; всС ΠΊΠ°Π΄Ρ€Ρ‹ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈ воспроизводятся с максимальной ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ AVI-Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ хрономСтричСскиС Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всСми ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ для воспроизвСдСния AVI-Ρ„Π°ΠΉΠ»ΠΎΠ².

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° полСзная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, которая Π±Ρ‹ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ AviPlay, β€” ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° 16- ΠΈ 24-Π±ΠΈΡ‚Π½Ρ‹Ρ… Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠΎΠ². Π’ прСдставлСнном Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ всСгда ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ 8-Π±ΠΈΡ‚Π½Ρ‹Π΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ нСзависимо ΠΎΡ‚ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ пиксСлСй воспроизводимого Ρ€ΠΎΠ»ΠΈΠΊΠ°.

Класс AviPlayWin 

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ возмоТностСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ AviPlay обСспСчиваСтся классом AviPlayWin, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ DirectDraw ΠΎΡ‚ класса DirectDrawWin. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ этой ΠΊΠ½ΠΈΠ³ΠΈ класс AviPlayWin ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ„Π°ΠΉΠ»Π°. ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ повСрхности ΠΏΡ€ΠΈ запускС, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° AviPlay (ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° BmpView ΠΈΠ· Π³Π»Π°Π²Ρ‹ 5) ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Ρ„Π°ΠΉΠ». Π—Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт повСрхности ΠΈ настраиваСт ΠΈΡ… Π² соотвСтствии с содСрТимым Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса AviPlayWin ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² листингС 8.1.


Листинг 8.1. Класс AviPlayWin

class AviPlayWin : public DirectDrawWin {

public:

 AviPlayWin();

protected:

 //{{AFX_MSG(AviPlayWin)

 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

 afx_msg void OnDestroy();

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

private:

 int SelectInitialDisplayMode();

 BOOL CreateCustomSurfaces() {

  return TRUE;

 }

 void DrawScene();

 void RestoreSurfaces();

 void GetSystemPalette();

 void ShowDialog();

 BOOL LoadAvi();

 BOOL CreateAviSurface();

 BOOL UpdateAviSurface();

 BOOL InstallPalette();

private:

 AviDialog* avidialog;

 CString fullfilename;

 CString filename;

 CString pathname;

 CRect displayrect;

 LPDIRECTDRAWSURFACE avisurf;

 CRect avirect;

 int x,y;

 DisplayModeArray displaymode;

 LPDIRECTDRAWPALETTE syspal;

 LPDIRECTDRAWPALETTE avipal;

 PAVISTREAM avistream;

 AVISTREAMINFO streaminfo;

 HIC decomp;

 long fmtlen, buflen;

 long startframe, endframe;

 long curframe;

 LPBITMAPINFOHEADER srcfmt;

 LPBITMAPINFOHEADER dstfmt;

 BYTE* rawdata;

 BYTE* finaldata;

};

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ объявляСм конструктор класса AviPlayWin, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… класса.

Π’ классС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сообщСний: OnKeyDown(), OnRButtonDown(), OnCreate() ΠΈ OnDestroy(). Ѐункция OnKeyDown() слСдит Π·Π° Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиш Escape ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π° Π²ΠΎ врСмя воспроизвСдСния, ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΠΈΠΊ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° AVI-Ρ„Π°ΠΉΠ»Π° (ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ DirectInput, Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° AviPlay Π½Π΅ стоит ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ…Π»ΠΎΠΏΠΎΡ‚). Ѐункция OnRButtonDown() Ρ‚ΠΎΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° AVI-Ρ„Π°ΠΉΠ»Π°, Π½ΠΎ ΠΏΠΎ Ρ‰Π΅Π»Ρ‡ΠΊΡƒ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ. Ѐункция OnCreate() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ DirectDraw ΠΈ AVI, Π° функция OnDestroy() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ объявляСм 10 Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… (private) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ΄Π΅Ρ‚ функция SelectInitialDisplayMode(), которая выполняСт Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ: Π²Ρ‹Π±ΠΎΡ€ исходного Π²ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌΠ° (Ρ‚ΠΎ, для Ρ‡Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° сама функция), построСниС списка 8-Π±ΠΈΡ‚Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ Π·Π°Ρ…Π²Π°Ρ‚ систСмной ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹. ВскорС ΠΌΡ‹ рассмотрим эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Ѐункция GetSystemPalette() вызываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ SelectInitialDisplayMode(); ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΡ€ΠΈ знакомствС с послСднСй.

Ѐункция CreateCustomSurfaces() объявлСна встроСнной (inline). Она всСго лишь Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ запускС прилоТСния повСрхности Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция, ShowDialog(), ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈ Π² случаС Π²Ρ‹Π±ΠΎΡ€Π° допустимого AVI-Ρ„Π°ΠΉΠ»Π° Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ LoadAvi(). Основная Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ обСспСчиваСтся этими двумя функциями, поэтому ΠΌΡ‹ рассмотрим ΠΈΡ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ.

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