• Thứ Hai, 13/09/2004 16:31 (GMT+7)

    Lập trình Delphi đón bắt thông điệp thay đổi theme của Windows XP

        Nếu lập trình Delphi và có sử dụng đối tượng (component) TTrackbar thì khi chạy trong môi trường Windows XP bạn sẽ phát hiện một vấn đề: khi thay đổi theme của Windows XP thì màu nền của component này không thay đổi theo theme. Bạn có thể quan sát hình Form1, các component TTrackbar vẫn giữa màu nền cũ của Form1.
       
    Chúng ta có thể giải quyết vấn đề này bằng cách xử lý thông điệp thay đổi theme mà Windows gửi đến cho các ứng dụng. Để làm điều này tôi sử dụng thông điệp có giá trị:

    WM_THEMECHANGED = $031A;
       
    Bạn có thể tìm thấy hằng số này trong Unit messages của Delphi 7.0, các phiên bản thấp hơn không có hằng số này, do đó tôi khai báo hằng số này trong Unit để có thể dùng cho các phiên bản thấp hơn. Để tiện lợi và trực quan, chúng ta hãy xây dựng một component tương tự như TTrackbar, đặt tên là TATrackbar, và bạn có thể nhúng vào ứng dụng như một TTrackbar. Cụ thể làm như sau (hướng dẫn sau dùng với Delphi 7.0, các phiên bản khác làm tương tự):
       
    Bạn đóng tất cả các file và project lại, sau đó vào File.New.Unit, một cửa sổ xuất hiện, hãy xoá hết và nhập vào nội dung mã nguồn ATrackbar.pas và lưu lại với tên này. Tiếp theo bạn đóng Unit này lại và vào Component.Install component..., chọn thẻ Into new package. Trong hộp Unit file name bạn chọn Unit ATrackbar.pas vừa soạn, trong hộp Package file name nhập tên project, chẳng hạn TATrackbar, trong hộp Package description nhập TATrackbar, sau đó nhấn OK. Delphi sẽ hỏi bạn có muốn xây dựng component này không, bạn chọn No, tiếp đến ghi Project này bằng cách vào File.Save all và cuối cùng chọn Install trên cửa sổ của component là xong. Quá trình cài đặt component thành công, Delphi sẽ tạo một thẻ có tên NQA - Visual Components trên hộp component như Standard, Win32... Chú ý, bạn cần phải khai báo đường dẫn đến file ATrackbar.pas này bằng cách vào Tool.Environment Options..., chọn thẻ Library, chọn mục Library path và nhập tên đường dẫn đến file .pas trên.
    Để sử dụng thành quả này, thay vì dùng TTrackbar của Delphi, bạn dùng TATrackbar trong NQA - Visual Components và cảm nhận sự khác biệt khi thay đổi theme trong Windows XP! Bạn có thể vào Website của tôi để download component này cùng với mã nguồn chương trình. Hi vọng được trao đổi cùng các bạn.

    file ATrackbar.pas

    unit ATrackbar;

    interface

    uses

      Windows, Classes, Controls, CommCtrl, Graphics, Messages, ComCtrls, Dialogs;

    const

      {$EXTERNALSYM WM_THEMECHANGED}

      WM_THEMECHANGED = $031A;

    type

      TATrackbar = class(TTrackBar)

      private

        fAbout : String;

        fEmail : String;

      public

        constructor Create (AOwner : TComponent); override;

        procedure Dispatch (var Message); override;

        procedure SetAbout(Value: string);

        procedure SetEmail(Value: string);

      published

        property About: string read fAbout write SetAbout;

        property Email: string read fEmail write SetEmail;

      end;

    procedure Register;

    implementation

    procedure Register;

    begin

      RegisterComponents(‘NQA - Visual Components’,[TATrackbar]);

    end;

    constructor TATrackbar.Create (AOwner : TComponent);

    begin

      inherited;

      fAbout := ‘Version 1.0, Copyright © 2003 Ngo Quoc Anh’;

      fEmail := ‘bookworm_vn@yahoo.com’;

    end;

    procedure TATrackbar.Dispatch (var Message);

    begin

      if HandleAllocated then

        begin

          with TMessage(Message) do

            begin

              case Msg of

                 WM_THEMECHANGED :

                   begin

                    Sleep(1000);

                      RecreateWnd;

                end;

              end;

           end;

        end;

      inherited;

    end;

    procedure TATrackbar.SetAbout(Value: string);

    begin

      Exit;

    end;

    procedure TATrackbar.SetEmail(Value: string);

    begin

      Exit;

    end;

    end.

     
    Ngô Quốc Anh
    bookworm_vn@yahoo.com
    http://www10.brinkster.com/ngoquocanh/

    ID: A0308_99