• Thứ Hai, 18/10/2010 16:28 (GMT+7)

    Tạo chương trình chơi nhạc bằng VC++

    Nguyễn Văn Hiệp
    Bạn muốn tạo chương trình nhạc có các hiệu ứng đồ hoạ tương tự Windows Media Player? Sau đây là qui trình chi tiết điển hình để viết ứng dụng đơn giản chơi tập tin multimedia có phần mở rộng là *.mp3 bằng VC++ 6.0.

    Chương trình chơi nhạc

    1. Chạy Visual C++ 6.0 (thí dụ bằng cách chọn mục Start.Programs.Microsoft Visual Studio 6.0.Microsoft Visual C++ 6.0).

    2. Chọn menu File.New để hiển thị cửa sổ New. Chọn tab Project, chọn mục MFC AppWizard (exe), chọn thư mục chứa Project ở mục Location, nhập tên project vào textbox Project name (thí dụ nhập tên MyWMP) rồi chọn button Ok để bắt đầu các bước khai báo thông số cho Project.

    3. Ở cửa sổ Step 1, bạn chọn checkbox Dialog based, rồi chọn button Finish để hoàn thành qui trình Wizard tạo Project.

    4. Khi Form ban đầu của ứng dụng hiển thị, bạn xóa tất cả các đối tượng có sẵn trong Form (gồm 2 button và 1 label).

    5. Chọn menu Project.Add to Project.Components and Controls để hiển thị cửa sổ Components and Controls Gallery, mở rộng mục Registered ActiveX Controls, duyệt tìm và chọn mục Windows Media Player, chọn button Insert để "add" ActiveX này vào cửa sổ Toolbox của Project ứng dụng.

    6. Chọn icon Windows Media Player (WMP) và vẽ nó vào form trống như hình dưới.

    7. Chọn menu View.ClassWizard để hiển thị cửa sổ MFC ClassWizard. Chọn tab Member Variables, chọn ID của đối tượng WMP (mặc định là IDC_OCX1), ấn button Add Variable, nhập tên biến là m_wmp rồi chọn button OK.

    8. Trong cửa sổ cây Project bên trái, chọn tab FileView, mở rộng tuần tự mục MyWMP.Source Files, duyệt tìm mục MyWMPDlg.cpp, nhấn đúp chuột vào mục này để mở cửa sổ hiển thị nội dung mã nguồn của file này. Duyệt tìm hàm OnInitDialog, dời cursor về cuối hàm này (ngay trước lệnh return TRUE;) rồi nhập thêm đoạn code để chơi file *.mp3 từ hàng lệnh như sau:

    // TODO: Add extra initialization here

    //khai báo các biến cần dùng

    char* cmdline = GetCommandLine();

    int i;

    //duyệt tìm khoảng trống ngăn cách trong chuỗi

    for (i=0; i<strlen(cmdline); i++)

    if (cmdline[i] == ' ') break;

    //nếu tìm được, hiệu chỉnh lại biến cmdline

    if (i <strlen(cmdline)) cmdline = &cmdline[i+1];

    //biến cmdline hiện chứa đường dẫn file cần play

    //thiết lập file cần chơi để WMP chơi dùm

    m_wmp.SetUrl(cmdline);

    9. Chọn menu Build.Set Active Configuration, chọn mục Win32 Release rồi button OK để thiết lập chế độ dịch ứng dụng.

    10. Build.ReBuild All để dịch ứng dụng ra file khả thi ở chế độ Release. Nếu không có lỗi thì máy sẽ tạo ra file khả thi ở thư mục Release trong Project tương ứng.

    11. Copy file khả thi (MyWMP.exe) về thư mục ổn định (hoạt động này được gọi là cài đặt ứng dụng), thí dụ ở c:\MyProgram.

    12. Chọn Start.Run và nhập lệnh regedit để chạy tiện ích này, khi cửa sổ "Registry Editor" hiển thị, chọn key HKEY_CLASSES_ROOT, nhấn phải chuột vào key này và chọn lệnh New.Key để tạo 1 key mới trong key tương ứng, nhập tên key mới là MyWMP. Tiếp tục tạo key shell trong MyWMP, key open trong key shell, key command trong key open. Nội dung của key command lúc đầu chưa có, dời chuột về mục (Default) trong listbox hiển thị nội dung của key command, nhấn phải chuột vào nó và chọn lệnh Mofify, nhập dòng lệnh sau vào textbox "Value data":

    c:\MyProgram\MyWMP %1 trong đó %1 là tham số hình thức miêu tả đường dẫn file dữ liệu mà ứng dụng MyWMP.exe sẽ xử lý mỗi khi nó được kích hoạt bởi Windows Explorer

    13. Cũng trong key HKEY_CLASSES_ROOT, duyệt tìm key ".mp3" (và/hoặc .wma,... như bạn muốn), nếu chưa có thì tạo mới, và chọn nó để hiển thị nội dung chi tiết lên listbox bên phải. Dời chuột về mục (Default) trong listbox hiển thị nội dung của key tương ứng, nhấn phải chuột vào nó và chọn lệnh Mofify, nhập chuỗi sau vào textbox "Value data": MyWMP

    14. Mọi chuyện đã xong, bây giờ bạn hãy chạy Windows Explorer, thử duyệt tìm trong hệ thống file và thử nhấn đúp chuột vào file có phần nới rộng *.mp3 (và/hoặc .wma,... như bạn muốn). Nếu không có lỗi thì ứng dụng MyWMP.exe sẽ chạy và chơi được file multimedia tương ứng.

    Thêm hiệu ứng đồ họa

    Nếu đứng ở góc nhìn lập trình, bạn xem Windows như một thư viện lập trình rất lớn, nó cung cấp nhiều hàm chức năng trên nhiều lĩnh vực khác nhau, chúng được sắp xếp theo nhiều nhóm hàm, mỗi nhóm hàm gồm nhiều hàm liên quan đến một lĩnh vực cụ thể. Thí dụ để vẽ đồ họa, bạn dùng các hàm API Windows trong nhóm GDI (Graphics Device Interface). Để vẽ các phần tử đồ họa cơ bản, bạn có thể gọi các hàm như LineTo(), Arc(), Rectangle(), Ellipse(), Polygon(),.. Để vẽ ảnh bitmap có sẵn (thường được chứa trong các file ảnh) ra cửa sổ của ứng dụng, bạn có thể gọi các hàm LoadImage() và BitBlt (hay StretchBlt). Hàm LoadImage() được dùng để nạp file ảnh vào bộ nhớ, còn hàm BitBlt() được gọi để hiển thị ảnh lên cửa sổ màn hình. Sau đây là qui trình chi tiết điển hình để viết 1 ứng dụng nhỏ bằng VC++ demo việc dùng hàm BitBlt() để hiển thị ảnh có sẵn trên file.

    1. Chạy Visual C++ 6.0 (thí dụ bằng cách chọn mục Start.Programs.Microsoft Visual Studio 6.0.Microsoft Visual C++ 6.0).

    2. Chọn menu File.New để hiển thị cửa sổ New. Chọn tab Project, chọn mục MFC AppWizard (exe), chọn thư mục chứa Project ở mục Location, nhập tên project vào textbox "Project name" (thí dụ nhập tên MyPicDisp) rồi chọn button Ok để bắt đầu các bước khai báo thông số cho Project.

    3. Ở cửa sổ Step 1, bạn chọn checkbox Dialog based, rồi chọn button Finish để hoàn thành qui trình Wizard tạo Project.

    4. Khi Form ban đầu của ứng dụng hiển thị, bạn xóa tất cả các đối tượng có sẵn trong Form (gồm 2 button và 1 label). Bạn có thể thay đổi kích thước của form ứng dụng theo yêu cầu.

    5. Trong cửa sổ cây Project bên trái, chọn tab FileView, mở rộng tuần tự mục MyPicDisp.Source Files, duyệt tìm mục MyPicDispDlg.cpp, ấn kép chuột vào mục này để mở cửa sổ hiển thị nội dung mã nguồn của file này. Duyệt tìm hàm OnPaint, dời cursor về thân của nhánh else rồi nhập thêm đoạn code để hiển thị ảnh từ file như sau:

    //đoạn code viết thêm để hiển thị ảnh từ file

    //khai báo các biến cần dùng

    HBITMAP hbm;

    HDC hdc, hdcTemp;

    BITMAP bm;

    //nạp file ảnh vào đối tượng bitmap trong bộ nhớ

    hbm = (HBITMAP)LoadImage( NULL, "c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

    //kiểm tra, nếu thất bại thì dừng

    if (hbm == NULL) return;

    //xác định Device context của form hiển thị

    hdc = this->GetDC()->m_hDC;

    //tạo 1 Device context mới tương ứng với form

    hdcTemp = CreateCompatibleDC(hdc);

    //chứa đối tượng bitmap vào DC mới

    SelectObject(hdcTemp, hbm);

    //xác định kích thước của bitmap

    GetObject(hbm, sizeof(BITMAP), &bm);

    //hiển thị vùng bitmap gốc trên trái có kích thước 300*300

    //lên vị trí (10,10) của form.

    BitBlt(hdc, 10, 10, 300, 300, hdcTemp, 0, 0, SRCCOPY);

    //giải phóng DC của form

    ::ReleaseDC(m_hWnd,hdc);

    6. Chọn menu Build.ReBuild All để dịch ứng dụng ra file khả thi ở chế độ hiện hành (mặc định là Debug).

    7. Chọn menu Build.Execute MyPicDisp.exe để chạy thử ứng dụng.

    Lưu ý trong lệnh gọi hàm BitBlt() ở đoạn code trên, chúng tôi xác định vùng hiển thị có kích thước là 300*300 pixel, nếu ảnh gốc có kích thước lớn hơn thì chỉ có vùng ảnh gốc với kích thước 300*300 được hiển thị, phần còn lại của ảnh gốc không được hiển thị. Nói cách khác hàm BitBlt() chỉ copy 1 phần ảnh gốc và hiển thị theo kích thước xác định với tỉ lệ 1/1, nó không thể phóng to/thu nhỏ ảnh gốc trước khi hiển thị. Nếu muốn phóng to/thu nhỏ ảnh gốc trước khi hiển thị vào vùng hiển thị có kích thước xác định, bạn nên dùng hàm StretchBlt(), thí dụ nếu bạn thay lệnh gọi BitBlt bằng lệnh gọi StretchBlt như sau:

    StretchBlt(hdc, 10, 10, 300, 300, hdcTemp, 0, 0, bm.bmWidth, bm.bmWidth, SRCCOPY);

    thì máy sẽ thu nhỏ và hiển thị toàn bộ ảnh gốc (cho dù có kích thước rất lớn) vào vùng màn hình có kích thước 300*300 theo qui định.

    ID: A1008_124