• Thứ Hai, 09/02/2009 07:17 (GMT+7)

    Visual C++ 2008 Feature Pack: Tăng cường sức mạnh cho Visual C++

    Microsoft đã công bố chính thức Visual C++ 2008 Feature Pack – gói công cụ bổ sung tính năng cho VC++ 2008. Đây thật sự là món quà đáng giá cho các lập trình viên trong việc phát triển ứng dụng trên nền VC++. Bài viết xin giới thiệu tổng quan về gói công cụ này cũng như việc sử dụng nó nhằm lập trình VC++ hiệu quả hơn.

    Cài đặt

    Gói công cụ bổ sung này chỉ dành riêng cho Visual C++ 2008 từ bản Standard trở lên (không hỗ trợ bản Express, tuy nhiên Microsoft hứa hẹn sẽ hỗ trợ trong tương lai). Bạn có thể tải về bộ cài đặt từ địa chỉ http://www.microsoft.com/downloads/details.aspx?FamilyId=D466226B-8DAB-445F-A7B4-448B326C48E7&displaylang=en (hoặc đường link rút gọn http://tinyurl.com/34n52u), dung lượng 322.84MB. Hiện tại, gói bổ sung này mới chỉ làm việc với phiên bản tiếng Anh (ENU) của VS 2008. Việc hỗ trợ cho các phiên bản khác sẽ được bổ sung trong bản vá VS2008 SP1 (đang trong giai đoạn beta).

    Cần chú ý, bạn phải cài đặt Windows SDK phiên bản 6.1 trước khi cài đặt gói bổ sung này. Nếu làm ngược lại, có thể bộ SDK sẽ cài đè và làm mất một số tính năng của VC++ Feature Pack. Trong trường hợp đã lỡ cài gói bổ sung này trước, cài SDK sau, bạn có thể cài lại VS 2008 theo chế độ “repair”.

    Gói bổ sung này chủ yếu tập trung vào việc tăng cường hỗ trợ cho lập trình giao diện của ứng dụng, cụ thể như:

    - Hỗ trợ các giao diện như “ribbon” của Office 2007, giao diện kiểu “look and feel” của Office 2003/XP hay phong cách “docking toolbar” và “pane” trong Visual Studio...

    - Tùy biến tối đa thanh công cụ và menu

    - Hỗ trợ các điều khiển nâng cao

    Một điều cần chú ý là khi phân phối các ứng dụng được phát triển trên nền VC++ feature pack, bạn nên đính kèm bộ cài đặt của Visual C++ 2008 Feature Pack Redistributable Package thay vì VC++ 2008 Redistritable Package như thông thường. Tải về gói cài đặt này tại địa chỉ http://www.microsoft.com/downloads/details.aspx?familyid=D5692CE4-ADAD-4000-ABFE-64628A267EF0&displaylang=en (http://tinyurl.com/6p3gxm, phiên bản x86) hoặc http://www.microsoft.com/downloads/details.aspx?familyid=7B50FDDF-4798-4FCE-8A8B-A8DFE556C8E4&displaylang=en (http://tinyurl.com/6bd45b, phiên bản x64), dung lượng khoảng hơn 4MB.

    Sử dụng VC++ feature pack trong lập trình ứng dụng MFC

    Từ trước đến nay MFC – Microsoft Foundation Classes vẫn được coi là bộ thư viện dành cho C++ đơn giản, thuận tiện và dễ dùng. MFC giảm bớt đáng kể công sức của lập trình viên so với lập trình Win32 API truyền thống. Tuy nhiên, so với các công cụ thuộc dạng RAD – Rapid application development như Visual Basic, Delphi hay gần đây là .NET thì MFC vẫn còn nặng nề trong việc xây dựng giao diện, đặc biệt là giao diện không theo chuẩn của Windows. Bạn có thể sử dụng một số gói mã nguồn bổ sung, như The Ultimate Toolbox (http://www.codeproject.com/KB/MFC/index.aspx?#MFC%20-%20Open%20Source%20Ultimate%20Toolbox), nhưng việc tạo ra một giao diện thống nhất, hợp lý vẫn tốn nhiều công sức.

    VC++ feature pack đã khắc phục thiếu sót này bằng cách bổ sung tính năng sử dụng những giao diện bắt mắt một cách dễ dàng mà bạn hầu như không phải gõ thêm dòng mã lệnh nào cả.

    Bạn chỉ việc chọn giao diện thích hợp trong khi tạo một dự án – project mới. Cần chú ý giao diện mới này chỉ sử dụng được với dạng project là SDI và MDI, cùng một kiểu mới được bổ sung vào là Multiple top-level documents, chứ không dùng được cho dạng Dialog-based.

    Ngay sau khi tạo dự án xong, bạn có thể tiến hành biên dịch và chạy thử ngay, kết quả cho ra thật sự ấn tượng với giao diện theo phong cách mà bạn lựa chọn.

    Để làm được điều này, VC++ feature pack đã bổ sung thêm 3 lớp mới:

    • CWinAppEx thừa kế từ lớp CWinApp được dùng làm base class cho ứng dụng.

    • CFrameWndEx thừa kế từ lớp CFrameWnd được dùng làm base class cho cửa sổ trong SDI – Single Document Interface.

    • CMDIFrameWndEx thừa kế từ lớp CMDIFrameWndEx được dùng làm base class cho cửa sổ trong MDI – Multi Document Interface.

    Chúng ta thấy sự thiếu vắng của lớp CDialog, và đó là lý do mà gói bổ sung này không hỗ trợ cho các ứng dụng dạng dialog – based. Đây quả thực là điều đáng tiếc vì hiện các ứng dụng dạng dialog vẫn được dùng rất phổ biến và việc tạo dựng một ứng dụng dialog với một giao diện “bắt mắt” không đơn giản.

    Mặc dù đã được VC++ hỗ trợ sinh mã một cách toàn diện, nhưng chúng ta nên nhìn qua xem điều gì đã thực sự xảy ra. Một đoạn mã khởi tạo ứng dụng thông thường có dạng như sau:

    class CMFCFeaturePackApp : public CWinAppEx

    {

    public: CMFCFeaturePackApp();

    // Overrides

    public: virtual BOOL InitInstance();

    };

    BOOL CMFCFeaturePackApp::InitInstance()

    {

    CWinAppEx::InitInstance();

    // CWnd* m_pMainWnd; được định nghĩa trong file .h

    SetRegistryKey(_T("DeltaX/MFCFeaturePack"));

    CSingleDocTemplate* pDocTemplate;

    pDocTemplate = new CSingleDocTemplate(

    IDR_MAINFRAME, RUNTIME_CLASS(CMFCFeaturePackDoc),

    RUNTIME_CLASS(CMainFrame),

    // main SDI frame window

    RUNTIME_CLASS(CMFCFeaturePackView));

    if (!pDocTemplate)

    return FALSE;

    AddDocTemplate(pDocTemplate);

    m_pMainWnd->ShowWindow(SW_SHOW);

    m_pMainWnd->UpdateWindow();

    return TRUE;
    }

    Cần chú ý, theo mặc định, VC++ sẽ tạo ra rất nhiều mã phục vụ cho các mục đích khác nhau, chẳng hạn như quản lý keyboard, menu, hiển thị tooltip,... Tùy theo yêu cầu của mình và để giảm kích thước của file thực thi .exe, bạn có thể xóa bớt những đoạn mã không cần thiết (điều này được khuyến cáo trong comment do chính VC++ tạo ra). Đoạn mã ở trên đã lược bỏ những thứ “thêm vào”, chỉ giữ lại những gì cơ bản nhất. Bạn có thể thấy không có nhiều thay đổi nếu như so sánh với mã nguồn cũ mà MFC tạo ra.

    Tuy nhiên, phần mà bạn cần thực sự quan tâm nằm ở MainFrm.cpp. Ở đây, bạn có thêm, bớt button vào ribbon, điều chỉnh lại panel,... Chúng ta hãy cùng nhìn qua cách thực hiện các công việc này, các đoạn mã minh họa dưới đây được dùng cho các ứng dụng sử dụng ribbon:

    Khai báo biến RibbonBar:

    CMFCRibbonBar m_wndRibbonBar;

    Khởi tạo trong hàm OnCreate:

    m_wndRibbonBar.Create(this);

    Điều chỉnh Ribbon Button

    Thiếu vắng menu quen thuộc trong giao diện ribbon, thành phần mới Ribbon Button đã được bổ sung để giúp người dùng nhanh chóng truy cập vào những chức năng quan trọng. Gắn với nó là Ribbon Panel, thường được thiết lập tương đương với menu File, nhưng bóng bẩy và trực quan hơn nhiều.

    //khai báo các biến

    CMFCRibbonApplicationButton m_MainButton;

    //thiết lập Ribbon button:

    m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));

    //45 là kích thước hợp lý cho Ribbon Button

    CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(_T(“File”), IDB_FILESMALL, IDB_FILELARGE);

    //khởi tạo Panel và gán 2 imagelist lớn – nhỏ cho Panel này

    //Bổ sung thêm chức năng vào Panel

    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, “New File”, 0, 0));


    Hàm khởi tạo của CMFCRIbbonButton như sau (còn một hàm overloading của hàm này, thay vì sử dụng Imagelist thì sử dụng một biến HICON để làm biểu tượng cho nút, tuy nhiên, cách dùng như dưới đây vẫn là phổ biến hơn):

    CMFCRibbonButton(UINT nID, LPCTSTR lpszText, int nSmallImageIndex=-1, int nLargeImageIndex=-1, BOOL bAlwaysShowDescription=FALSE );

    Trong đó nID là ID của nút, lpszText là nhãn của nút, nSmallImageIndex và nLargeImageIndex lần lượt là chỉ số index trong 2 imagelist nhỏ và lớn đã được gán cho biến pMainPanel.

    Một Ribbon Button lại có thể có những chức năng nhỏ hơn, chẳng hạn, như đối với chức năng Save as trong Microsoft Word 2007.

    Để thực hiện điều này, bạn có thể sử dụng method AddSubItem của Ribbon Button.

    Chẳng hạn:

    pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, “Quick Print”, 7, 7, TRUE));

    Cuối cùng, là bổ sung nút Close và danh sách những file mới được mở gần đây:

    pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, _T(“Close”), 9, 9));

    pMainPanel->AddRecentFilesList(_T(“Recent Files List:”));

    Điều chỉnh thanh ribbon

    Thanh ribbon mới thật sự là điểm nhấn quan trọng trong phong cách dải “duy băng” của Office 2007, nơi cung cấp tất cả những chức năng quan trọng nhất cho chương trình. Thanh ribbon cho phép tạo nhiều tab, mỗi tab lại có thể chứa nhiều nút nhấn, tương ứng với nhiều chức năng khác nhau.

    Đoạn mã dưới đây minh họa việc thêm một “Category” vào thanh ribbon. Mỗi Category sẽ tương ứng một tab, và gồm các phần nhỏ hơn là panel, mỗi panel lại gồm các ribbon button phục vụ các chức năng cụ thể:

    CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(“Home”, IDB_WRITESMALL, IDB_WRITELARGE); // 2 tham số sau tương ứng 2 imagelist nhỏ - lớn cho Category

    Bổ sung thêm panel, ở đây là Panel Clipboard (phục vụ việc copy-paste...)

    CMFCRibbonPanel* pPanelClipboard = pCategoryHome->AddPanel(“Clipboard”, m_PanelImages.ExtractIcon(27));

    Ở đây, m_PanelImages là một biến kiểu CMFCToolBarImages lưu trữ imagelist dành cho panel. Việc khởi tạo nó thực hiện như sau:

    m_PanelImages.SetImageSize(CSize(16, 16));

    m_PanelImages.Load(IDB_BUTTONS);

    Công việc cuối cùng là thêm các ribbon button thực hiện chức năng vào panel:

    CMFCRibbonButton* pBtnPaste = new CMFCRibbonButton(ID_EDIT_PASTE, strTemp, 0, 0);

    pPanelClipboard->Add(pBtnPaste);

    Trong khuôn khổ bài viết này, chúng tôi chỉ giới thiệu sơ bộ những nét chính trong việc tùy biến giao diện mang phong cách ribbon. Visual C++ feature pack còn đem đến nhiều kiểu giao diện khác và việc tùy biến chúng tương đối dễ dàng. Phong cách lập trình MFC quen thuộc sẽ giúp các lập trình viên nhanh chóng làm quen và nắm bắt được các class, method và property mới. Mặc dù VC++ đã làm phần lớn công việc cho bạn, nhưng bạn vẫn có thể điều chỉnh lại cho thích hợp, thậm chí tự viết mã để toàn quyền xử lý giao diện.

    Visual C++ Feature Pack còn đi kèm TR1, thư viện bổ sung cho C++ runtime và hiện đang được phát triển như là mở rộng cho chuẩn C++ 2003. Hy vọng sẽ có dịp giới thiệu về thư viện này.

    Mai Văn Quân
    Email:
    Vimvq1987@yahoo.com

    ID: A0901_109