314
Chương 8: Đồ họa, đa phương tiện, và in ấn
.NET Framework không chứa bất kỳ lớp được-quản-lý nào để tương tác với các file video,
nhưng bạn có thể sử dụng chức năng DirectShow của thư viện Quartz dựa-trên-COM (có
trong Windows Media Player và hệ điều hành Windows). Để biết cách tạo một Interop
Assembly cho thư viện Quartz, bạn hãy tham khảo mục 8.10.
Một khi đã tạo Interop Assembly, bạn có thể sử dụng giao diện
IMediaControl
để nạp và chơi
một file video. Về cơ bản, kỹ thuật này giống như kỹ thuật đã trình bày trong mục 8.10 với
file audio. Tuy nhiên, nếu muốn hiển thị cửa sổ video ngay bên trong giao diện ứng dụng của
bạn (hơn là trong một cửa sổ độc lập), bạn phải sử dụng giao diện
IVideoWindow
. Đối tượng
FilgraphManager
có thể được ép kiểu thành giao diện
IMediaControl
và
IVideoWindow
—và
nhiều giao diện khác cũng được hỗ trợ như
IBasicAudio
(cho phép bạn cấu hình các thiết lập
balance và volume). Với giao diện
IVideoWindow
, bạn có thể gắn kết xuất video vào một đối
tượng trên form như
Panel
hoặc
PictureBox
. Để làm được như vậy, bạn cần thiết lập thuộc
tính
IVideoWindow.Owner
là handle của điều kiểm đó (bạn có thể lấy được handle này bằng
thuộc tính
Control.Handle
). Kế tiếp, gọi
IVideoWindow.SetWindowPosition
để thiết lập kích
thước và vị trí của cửa sổ. Phương thức này cũng có thể được gọi để thay đổi kích thước video
trong quá trình playback (chẳng hạn, khi form bị thay đổi kích thước).
Ví dụ dưới đây cho phép người dùng mở bất kỳ file video nào và chơi nó trong một
PictureBox
.
PictureBox
bị neo đến tất cả các cạnh của form, như thế nó cũng thay đổi kích
thước khi form bị thay đổi kích thước. Đoạn mã đáp ứng cho sự kiện
PictureBox.SizeChanged
sẽ thay đổi kích thước của cửa sổ video tương ứng.
using System;
using QuartzTypeLib;
using System.Windows.Forms;
public class ShowMovie : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button cmdOpen;
// (Bỏ qua phần mã designer.)
// Định nghĩa các hằng dùng để chỉ định window style.
private const int WM_APP = 0x8000;
private const int WM_GRAPHNOTIFY = WM_APP + 1;
private const int EC_COMPLETE = 0x01;
private const int WS_CHILD = 0x40000000;
private const int WS_CLIPCHILDREN = 0x2000000;