Tuesday, October 27, 2009

Đưa biểu tượng chương trình vào Systray Bằng Delphi

Bài viết này sẽ hướng dẫn bạn cách dùng hàm API để đưa biểu tượng chương trình vào systray (khay hệ thống nơi chứa chiếc đồng hồ trên thanh Taskbar). Chương trình viết bằng Delphi 6.0, có mã nguồn đi kèm

1. Tạo giao diện

- Bạn mở 1 Project mới, và thiết kế 1 Form như hình dưới đây

- Bạn thiết kế PopupMenu1 như hình dưới đây

2. Viết Code

- Bạn mở cửa sổ Code ra (bấm F12) trong phần Uses của Unit1 bạn khai báo thêm 2 Units sau:

uses Registry, ShellAPI.

- Trong phần Type bạn khai báo thêm 1 kiểu dữ liệu kiểu bản ghi như sau:

type
//Cấu trúc NOTIFYICONDATA
NOTIFYICONDATA = record
cbSize:WORD;
hWnd:HWND;
uID,uFlags,uCallbackMessage: UINT;
hIcon:HICON;
szTip:array[0..63]of char;
end;

- Trong phần Var khai báo thêm 2 biến như sau:

var
//Biến toàn cục kiểu NOTIFYICONDATA
pnid: NOTIFYICONDATA;
//Biến dùng để chứa vị trí Mouse
MousePos: TPoint;

- Trong phần Implementation khai báo hàm API như sau

implementation

{$R *.dfm}

//Hàm API phục vụ việc đưa biểu tượng chương trình vào systray
Function Shell_NotifyIconA (dwMessage:Longint;var pnid: NOTIFYICONDATA): Boolean;stdcall;External 'shell32';

- Bạn mở giao diện ra (bấm F12), click đúp vào khoảng trống của Form1, khi đó cửa sổ Code sẽ hiện ra và cho ta 1 thủ tục mẫu có dạng

procedure TForm1.FormCreate(Sender: TObject);

begin

end;

thủ tục này sẽ được thực thi khi Form được tạo ra (ngay khi chạy chương trình)

Bạn thay thế nó bằng đoạn Code dưới đây, để có được một thủ tục hoàn chỉnh như sau

procedure TForm1.FormCreate(Sender: TObject);
begin
//Khởi tạo các thông số cho cấu trúc NOTIFYICONDATA
//Kích thước cấu trúc NOTIFYICONDATA
pnid.cbSize :=sizeof(pnid);
pnid.uID := 1;
//Handle của icon cần hiển thị trên systray
pnid.hIcon := image1.Picture.Icon.Handle;
//Handle của cửa sổ mà hệ thống sẽ gửi các thông báo hệ thống (Message)
//thông qua icon trên systray
pnid.hWnd := form1.Handle;
//Thông báo (Mesage) mà hệ thống sẽ gửi cho cửa sổ chính
//thong qua icon trong systray, (sự kiện Mouse)
pnid.uCallbackMessage := WM_MOUSEMOVE;
pnid.uFlags :=NIF_ICON Or NIF_TIP Or NIF_MESSAGE;
//Dòng chữ hiện ra khi bạn di chuột vào icon trên systray
pnid.szTip := 'Friends2002';
end;

- Bạn lần lượt Click đúp vào các Button và nhập mã như sau

procedure TForm1.Button1Click(Sender: TObject);
begin
//Thực hiện đưa biểu tượng vào systray
Shell_NotifyIconA(NIM_ADD, pnid);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
//Xoá biểu tượng khỏi systray
Shell_NotifyIconA(NIM_DELETE, pnid);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//Thay đổi nội dung cấu trúc NOTIFYICONDATA
pnid.cbSize :=sizeof(pnid);
pnid.uID := 1;
//Thay đổi icon khác
pnid.hIcon := image2.Picture.Icon.Handle;
pnid.hWnd := form1.Handle;
pnid.uCallbackMessage := WM_MOUSEMOVE;
pnid.uFlags :=NIF_ICON Or NIF_TIP Or NIF_MESSAGE;
//Thay đổi Tip khác
pnid.szTip := 'Friends2002 (c) 2002 by Tran Trung';

//Thực hiện thay đổi biểu tượng trong systray và Tip
Shell_NotifyIconA(NIM_MODIFY, pnid);
end;

- Bạn chọn Form1 trong Commobox phía trên của cửa sổ ObjectInspector, sau đó chọn Tab Events, rồi click đúp vào cột bên phải của dòng OnClose, khi đó thủ tục sau sẽ tự động được tạo ra

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin

end;

Bạn nhập đoạn mã vào giữa cặp Begin .. end; để thủ tục đó như sau

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Xoá biểu tượng khỏi systray
Shell_NotifyIconA(NIM_DELETE, pnid);
end;

- Tiếp theo là thủ tục rất quan trọng, nó cho phép bạn gọi đến một thủ tục khác hoặc thi hành lệnh khi bạn click lên biểu tượng trên Systray

Bạn lại chọn Form1 trong Commobox phía trên của cửa sổ ObjectInspector, sau đó chọn Tab Events, rồi click đúp vào cột bên phải của dòng OnMouseMove, khi đó thủ tục đáp ứng sự kiện chuột di chuyển trên Form tự động được tạo ra, bạn nhập thêm mã vào giữa cặp Begin .. end; để nó có dạng như sau.

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var Msg:Longint;
begin
msg:=X;
case Msg of
WM_RBUTTONUP: //Khi nút chuột phải nhả ra
begin
GetCursorPos(MousePos); //Lấy vị trí hiện tại của Mouse
popupmenu1.Popup(MousePos.X,MousePos.Y); //Mở menu popup
end;
WM_LBUTTONUP: //Khi nút chuột trái nhả ra
begin
if form1.Visible = false then form1.Show else form1.Hide ;
end;
end;

end;

- Bạn click đúp vào PopupMenu1 nằm trên cửa sổ giao diện, khi đó cửa sổ sau sẽ hiện ra

Bạn click đúp vào About, thủ tục đáp ứng sự kiện khi bạn chọn menu này sẽ hiện ra, bạn nhập mã như sau

procedure TForm1.About1Click(Sender: TObject);
begin
showmessage('Chuong trinh dua bieu tuong vao systray'+chr(13)+'(c)2002 by Tran Trung'+chr(13)+'E-mail: trantrung22@yahoo.com');
end;

Tương tự click đúp vào Exit và nhập mã như sau

procedure TForm1.Exit1Click(Sender: TObject);
begin
close;
end;

No comments:

Post a Comment