文/小逗逗 下面以一個具体的例子,詳細介紹一下利用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 {.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 4.編寫FormCreate的代碼如下: procedure TForm1.FormCreate(Sender: TObject); begin ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的長度 ntida.Wnd := handle; //取應用程序主窗体的句柄 ntida.uID := iid; //用戶自定義的一個數值,在uCallbackMessage參數指定的消息中使 ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在該結构中uCallbackMessage、hIcon和szTip參數都有效 ntida.uCallbackMessage := mousemsg; //指定的窗口消息 ntida.hIcon := Application.Icon.handle; //指定系統狀態欄顯示應用程序的圖標句柄 ntida.szTip := 'Icon'; //當鼠標停留在系統狀態欄該圖標上時,出現該提示信息 shell_notifyicona(NIM_ADD, @ntida); //在系統狀態欄增加一個新圖標 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; 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輕松實現系統狀態欄圖標。
程序如下:在头文件的private处加入: Normallcon:TIcon; procedure InstallIcon; //安装图标 procedure UninstallIcon;//卸载图标 procedure IconOnclick(var Msg:TMessage);message MI_ICONEVENT; //单击图标事件procedure TForm1.IconButtonClick(Sender: TObject); begin //在任务栏上显示/隐藏图标 if IconButton.Caption='显示图标' then begin InstallIcon;//显示图标 IconButton.Caption:='隐藏图标'; end else begin UnInstallIcon;//去掉图标 IconButton.Caption:='显示图标'; end; end;procedure TForm1.InstallIcon; var IconData:TNotifyIconData; result:array[0..255] of char; r:string; begin //显示图标//所要显示的图标目录及文件名 GetCurrentDirectory(255,result); r:=result+'\face03.ico';Normallcon:=TIcon.Create; Normallcon.LoadFromFile(r); with IconData do begin cbSize:=Sizeof(IconData); Wnd:=Handle; uId:=ICON_ID; uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallBackMessage:=MI_ICONEVENT; hicon:=Normallcon.Handle; szTip:='这是一个关于Delphi 6.0的例子!'; end; Shell_NotifyIcon(NIM_ADD,@IconData); end;procedure TForm1.UnInstallIcon; var IconData:TNotifyIconData; begin //去掉图标 with IconData do begin cbSize:=Sizeof(IconData); wnd:=Handle; uId:=ICON_ID; end; Shell_NotifyIcon(NIM_DELETE,@IconData); end;procedure TForm1.IconOnClick(var Msg:TMessage); var p:TPoint; begin //单击图标事件//如果窗口为隐藏时,单击鼠标左键显示该窗口 if(Msg.LParam=WM_LBUTTONDOWN) and (Form1.Visible=false)then Form1.Show;////如果窗口为隐藏时,单击鼠标右键显示该一菜单PopupMenu1 if (Msg.LParam=WM_RBUTTONDOWN) and (Form1.Visible=false) THEN begin getCursorpos(p); PopupMenu1.Popup(p.X,p.Y); end; end;
利用Delphi實現系統狀態欄圖標 --------------------------------------------------------------------------------
http://www.sina.com.cn 賽迪网
文/小逗逗 下面以一個具体的例子,詳細介紹一下利用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 {.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 4.編寫FormCreate的代碼如下: procedure TForm1.FormCreate(Sender: TObject); begin ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的長度 ntida.Wnd := handle; //取應用程序主窗体的句柄 ntida.uID := iid; //用戶自定義的一個數值,在uCallbackMessage參數指定的消息中使 ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在該結构中uCallbackMessage、hIcon和szTip參數都有效 ntida.uCallbackMessage := mousemsg; //指定的窗口消息 ntida.hIcon := Application.Icon.handle; //指定系統狀態欄顯示應用程序的圖標句柄 ntida.szTip := 'Icon'; //當鼠標停留在系統狀態欄該圖標上時,出現該提示信息 shell_notifyicona(NIM_ADD, @ntida); //在系統狀態欄增加一個新圖標 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; 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輕松實現系統狀態欄圖標。
Normallcon:TIcon;
procedure InstallIcon; //安装图标
procedure UninstallIcon;//卸载图标
procedure IconOnclick(var Msg:TMessage);message MI_ICONEVENT; //单击图标事件procedure TForm1.IconButtonClick(Sender: TObject);
begin
//在任务栏上显示/隐藏图标
if IconButton.Caption='显示图标' then
begin
InstallIcon;//显示图标
IconButton.Caption:='隐藏图标';
end
else
begin
UnInstallIcon;//去掉图标
IconButton.Caption:='显示图标';
end;
end;procedure TForm1.InstallIcon;
var IconData:TNotifyIconData;
result:array[0..255] of char;
r:string;
begin
//显示图标//所要显示的图标目录及文件名
GetCurrentDirectory(255,result);
r:=result+'\face03.ico';Normallcon:=TIcon.Create;
Normallcon.LoadFromFile(r);
with IconData do
begin
cbSize:=Sizeof(IconData);
Wnd:=Handle;
uId:=ICON_ID;
uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage:=MI_ICONEVENT;
hicon:=Normallcon.Handle;
szTip:='这是一个关于Delphi 6.0的例子!';
end;
Shell_NotifyIcon(NIM_ADD,@IconData);
end;procedure TForm1.UnInstallIcon;
var IconData:TNotifyIconData;
begin
//去掉图标
with IconData do
begin
cbSize:=Sizeof(IconData);
wnd:=Handle;
uId:=ICON_ID;
end;
Shell_NotifyIcon(NIM_DELETE,@IconData);
end;procedure TForm1.IconOnClick(var Msg:TMessage);
var p:TPoint;
begin
//单击图标事件//如果窗口为隐藏时,单击鼠标左键显示该窗口
if(Msg.LParam=WM_LBUTTONDOWN) and (Form1.Visible=false)then
Form1.Show;////如果窗口为隐藏时,单击鼠标右键显示该一菜单PopupMenu1
if (Msg.LParam=WM_RBUTTONDOWN) and (Form1.Visible=false) THEN
begin
getCursorpos(p);
PopupMenu1.Popup(p.X,p.Y);
end;
end;