下面以一個具體的例子,詳細介紹一下利用Delphi實現系統狀態欄圖標的步驟和方法。
1.創建一個應用程序,在主窗體上增加一個TpopupMenu組件。並為該彈出選單組件增加選單項Exit,標題為“退出”。
2.在Uses中添加ShellAPI,因為在系統狀態欄中增加圖標時需調用ShellAPI中的函數Shell_NotifyIconA。該函數需要兩個參數,其中一個是TnotifyIconDataA結構,需在主窗體中增加TnotifyIconDataA類型的全局變量ntida。
3.定義消息mousemsg,並編寫主窗體的mousemessage消息處理函數,此函數說明在圖標上用鼠標左鍵單擊時,會打開應用程序窗口;用鼠標右鍵單擊時,會彈出一個選單。
下面給出步驟2和3的實現代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, shellapi;
const
mousemsg = wm_user + 1; //自定義消息,用於處理用戶在圖標上點擊鼠標的事件
iid = 100; //用戶自定義數值,在TnotifyIconDataA類型全局變量ntida中使用
type
TForm1 = class(TForm)
......
private
//自定義消息處理函數,處理鼠標點擊圖標事件
procedure mousemessage(var message: tmessage); message mousemsg;
public
{ Public declarations }
end;
var
Form1: TForm1;
ntida: TNotifyIcondataA;
//用於增加和刪除系統狀態圖標
implementation
{$R .DFM}
procedure TForm1.mousemessage(var message: tmessage);
var
mousept: TPoint; //鼠標點擊位置
begin
inherited;
if message.LParam = wm_rbuttonup then begin //用鼠標右鍵點擊圖標
getcursorpos(mousept); //獲取光標位置
popupmenu1.popup(mousept.x, mousept.y);
//在光標位置彈出選單
end;
if message.LParam = wm_lbuttonup then begin //用鼠標左鍵點擊圖標
//顯示應用程序窗口
ShowWindow(Handle, SW_SHOW);
//在任務欄上顯示應用程序窗口
ShowWindow(Application.handle, SW_SHOW);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
not (GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));
end;
message.Result := 0;
end
5.編寫Tform1.OnClose的代碼如下:
procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction);
begin
Action := caNone; //不對窗體進行任何操作
ShowWindow(Handle, SW_HIDE); //隱藏主窗體
//隱藏應用程序窗口在任務欄上的顯示
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW);
end;
procedure TForm1.FormClose(Sender:TObject; var Action: TCloseAction);
begin
Action := caNone; //不對窗體進行任何操作
ShowWindow(Handle, SW_HIDE); //隱藏主窗體
//隱藏應用程序窗口在任務欄上的顯示
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.handle, GWL_EXSTYLE)
or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW);
end;
6.編寫Exit代碼如下:
當用戶點擊Exit時實現完全退出應用程序。具體代碼如下:
procedure TForm1.ExitClick(Sender:TObject);
begin
//為ntida賦值,指定各項參數
ntida.cbSize := sizeof(tnotifyicondataa);
ntida.wnd := handle;
ntida.uID := iid;
ntida.uFlags := nif_icon + nif_tip + nif_message;
ntida.uCallbackMessage := mousemsg;
ntida.hIcon := Application.Icon.handle;
ntida.szTip := 'Icon';
shell_notifyicona(NIM_DELETE, @ntida);
//刪除已有的應用程序圖標
Application.Terminate;
//中斷應用程序運行,退出應用程序
end
通過以上步驟,我們即可用Delphi輕松實現系統狀態欄圖標。