• Thứ Ba, 16/12/2003 14:54 (GMT+7)

    Xây dựng ứng dụng với control chuẩn theo style của XP bằng Delphi


    Trong PC World Việt Nam số tháng 10 năm 2002, tác giả Lâm Vĩ Quốc đã trình bày cách xây dựng ứng dụng với các control chuẩn theo style XP bằng C#. Bài viết này tôi xin trình bày cách xây dựng với các control chuẩn theo style của XP bằng
    Delphi (phiên bản 6.0 trở xuống).
    Về cơ bản, cách xây dựng style trong Delphi và trong C# không khác nhau, đều dùng file *.manifest. Trước hết bạn tạo một file manifest, ví dụ XPTheme.manifest với nội dung như sau:

     

    <?xml version=”1.0' encoding=”UTF-8' standalone=”yes”?>

    <assembly xmlns=”urn:schemas-microsoft-com:asm.v1' manifestVersion=”1.0'>

    <assemblyIdentity

        version=”1.0.0.0'

        processorArchitecture=”X86'

        name=”CompanyName.ProductName .YourApplication”

        type=”win32'

    />

    <description>Your application description here.</description>

    <dependency>

      <dependentAssembly>

         <assemblyIdentity

          type=”win32'

                name=”Microsoft.Windows.Common-Controls”

       version=”6.0.0.0'

       processorArchitecture=”X86'

    publicKeyToken=”6595b64144ccf1df”

                language=”*”

            />

        </dependentAssembly>

    </dependency>

    </assembly>
    Tiếp theo, để thuận tiện, tạo một RESOURCE để ghép file manifest vào file thực thi *.exe (chú ý, file RESOURCE và file manifest phải nằm ở cùng một thư mục). Ở đây tôi đặt tên file là XPTheme.rc, nội dung như sau:

     

    1 24 XPTheme.manifest
    Để biên dịch RESOURCE này, bạn vào thư mục BIN của Delphi và chép 2 file có tên BRCC32.EXE và RW32CORE.DLL vào thư mục chứa 2 file mà bạn vừa tạo, tiếp theo thực hiện việc biên dịch RESOURCE bằng dòng lệnh:

     BRCC32 XPTheme.rc
    Sau khi biên dịch bạn sẽ có được file XPTheme.res. File này sẽ được Delphi nối vào file thực thi *.exe của bạn và nó có nhiệm vụ báo hiệu việc sử dụng phiên bản 6 của ComCtl32.dll (điều này được giải thích trong bài 'Xây dựng ứng dụng với các control theo chuẩn style của XP bằng C#', 10/ 2002, trang 86).
    Cuối cùng, bạn chỉ cần tạo một UNIT với tên XPTheme.pas (tên này đặt tuỳ ý, chủ yếu là dễ nhớ). Nội dung của UNIT này bao gồm các dòng lệnh sau:

     

    Unit XPTheme;

    {

      XPTheme.pas v1.0 by Ngo Quoc Anh, bookworm_vn@yahoo.com

    }

    Interface

    Implementation

    {$R XPTheme.res}

    uses

      CommCtrl;

    Initialization

      InitCommonControls;

    End.
    Tất cả quá trình xây dựng đã xong, để sử dụng bạn chỉ cần chép 2 file là XPTheme .pas và XPTheme.res cùng chương trình nguồn của bạn, đồng thời khai báo thêm UNIT XPTheme trong phần Uses ở bất cứ UNIT nào mà bạn dùng - thế là ứng dụng của bạn đã được ‘XP’ xong.

     

    Sau đây là ví dụ minh hoạ
    Vào File•New•Application. Delphi sẽ tự tạo cho bạn một form tên Form1 và Unit đi kèm với nó là Unit1. Bạn Remove form này bằng cách vào Project•Remove from Project và chọn Unit1 trong danh sách các Unit bạn đang sử dụng (mặc định trong danh sách chỉ có 1 Unit và Project của bạn chưa có gì). Vào Project•View source, một cửa sổ xuất hiện cho bạn biết nguồn của Project, bạn xoá và thêm vào các dòng lệnh sau:

     

    program XPDemo;

    uses SysUtils, Windows, Forms, XPTheme;

    function IsWindowsXP: Boolean;

    begin

      Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and

        ((Win32MajorVersion > 5) or

        ((Win32MajorVersion = 5) and

        (Win32MinorVersion >= 1)));

    end;

    begin

      if isWindowsXP then MessageBox(Application.Handle, ‘You are running on Windows XP platform’,’Warning’, MB_ICONEXCLAMATION + MB_OK)

      else MessageBox(Application.Handle,’You aren’’t running on Windows XP platform’,’Warning’, MB_ICONEXCLAMATION + MB_OK);

    end.
    Bạn dịch và chạy chương trình trong Windows XP sẽ nhận được thông báo (xem hình).
    Nếu bạn không sử dụng Unit XPTheme, cũng không sao! Nhưng khi chạy chương trình của bạn không được 'XP hoá'.
    Nếu bạn có sử dụng các thành phần TListView với kiểu là vsReport hoặc TStatusBar trong chương trình thì cần phải chỉnh sửa một số thông tin sau để xử lý khi thay đổi kích thước form. Bạn tìm file ComCtrls.pas trong thư mục Delphi\Source \Vcl và tìm đoạn:

     

    if FImageIndex <> -1 then

            fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES;

     

    và thay bằng

     

    if FImageIndex <> -1 then

            fmt := fmt or LVCFMT_IMAGE or LVCFMT_COL_HAS_IMAGES

          else

            mask := mask and not LVCF_IMAGE;

     

    Với TstatusBar, bạn thêm vào sự kiện StatusBar1Resize với nội dung sau:

     

    if StatusBar1.HandleAllocated then

         InvalidateRect(StatusBar1.Handle, nil, True);

    (ở đây tôi dùng TStatusBar trong chương trình với tên StatusBar1)

     
    Hi vọng bài viết này giúp ích được cho bạn. Mong nhận được ý kiến trao đổi và góp ý.

    Ngô Quốc Anh
    bookworm_vn@yahoo.com.

     

    Bổ sung bài viết: Xây dựng ứng dụng với các control chuẩn theo style của Windows XP
    Trong bài viết của bạn Lâm Vĩ Quốc đăng trên PC World VN số tháng 10/2002 (tr.86) đã trình bày khá chi tiết về cách thực hiện ứng dụng theo style của Windows XP. Ở đây tôi muốn bổ sung thêm cách áp dụng với Visual Basic 6.0.
    Trong VB 6 bạn tạo một project mới, trong phần khai báo chung của form bạn gõ vào nội dung sau:

     

    Option Explicit

    Private Declare Function InitCommonControls Lib “comctl32.dll” () As Long

     

    Trong thủ tục Initialize của form gõ vào nội dung:

    Private Sub Form_Initialize()

     InitCommonControls

    End Sub
    Sau khi đã tạo xong phần trên bạn có thể thêm các button, checkbox, option vào form để thử nghiệm, sau đó biên dịch ra file .exe. Phần còn lại thực hiện giống như trong bài viết của bạn Lâm Vĩ Quốc:
    - Tạo file manifest.
    -  Đổi tên và copy vào thư mục của chương trình vừa biên dịch.
    Như vậy là bạn đã tạo xong ứng dụng bằng VB 6 có style của Windows XP.

    Phạm Minh Đức
    de_chui@yahoo.com

    ID: A0301_84