線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6476
推到 Plurk!
推到 Facebook!

TrayIcon的使用小範例(使用Shell_NotifyIcon)

 
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-11 21:39:52 IP:61.221.xxx.xxx 未訂閱
本程式展示了一個程式中有兩個 tray icon 的功能, 並可以追踨在此兩個 tray icon 上 mouse 的行為, 用以程式化對 tray icon 的動作!! 參考資料: http://www.delphiboy.com/cgi-bin/doc/datacontent.php?no=236
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-11 23:13:53 IP:61.217.xxx.xxx 未訂閱
Delphi中工作列狀態區的設計          在Windows桌面的工作列上有一個凹陷的區域,其中顯示著系統時鐘以及一些圖示,這個長方形的區域便是Windows的工作列狀態區(taskbar status area)。本文將介紹使用Borland Delphi進行工作列狀態區的設計,即怎樣將應用程式的圖示顯示在工作列狀態區中。     實現原理     工作列狀態區的圖示添加、刪除、以及修改是通過Windows API函數Shell_NotifyIcon來實現的,該函數是由Windows的SHELL32.DLL動態聯接庫提供的。在Delphi中,Shell_NotifyIcon函數是在ShellAPI單元聲明的,其     函數原型如下:     function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;     其中參數dwMessage的取值決定函數Shell_NotifyIcon所要進行的操作的類型,它的取值可以是以下三者之一:     NIM_ADD(值為0):在工作列狀態區插入一個圖示。     NIM_DELETE(值為1):從工作列狀態區刪除一個圖示。     NIM_MODIFY(值為2):修改工作列狀態區的圖示、提示信息、或者通知消息。     參數lpData 是一個記錄類型(結構類型)的指標,記錄類型NotifyIconData的定義如下:       NOTIFYICONDATA = record     cbSize: DWORD;     Wnd: HWND;     uID: UINT;     uFlags: UINT;     uCallbackMessage: UINT;     hIcon: HICON;     szTip: array [0..63] of AnsiChar;   end; ---- cbSize:NOTIFYICONDATA記錄的大小。     Wnd:與此狀態區圖示相關聯的視窗句柄,此視窗將負責處理uCallbackMessage消息。     uID:程式自定義的狀態區圖示的標識符。     uFlags:這個字段指明NOTIFYICONDATA記錄中的成員uCallbackMessage、hIcon和szTip這三者的哪些項的值有效。它的取值可以是下列三者的組合(or運算):     NIF_MESSAGE (值為1):uCallbackMessage項包含了有效的信息。     NIF_ICON(值為2):hIcon項包含了有效的信息。     NIF_TIP(值為4): szTip項包含了有效的信息。     uCallbackMessage:程式定義的消息標識符(32位的整數)。當鼠標在狀態區圖示上移動或者點擊(即,發生了鼠標事件)時,操作系統將向Wnd指定的那個視窗發送uCallbackMessage消息。在uCallbackMessage消息中,lParam參數包含了Windows的鼠標消息的類型,而wParam參數則包含了圖示標識(即uID)。有效的鼠標消息包括以下幾個:WM_LBUTTONDOWN、WM_RBUTTONDOWN、WM_MBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONUP、WM_MBUTTONUP、WM_MOUSEMOVE、WM_LBUTTONDBLCLK、WM_RBUTTONDBLCLK以及WM_MBUTTONDBLCLK。     hIcon:指定一個圖示句柄。     szTip:顯示在圖示上的提示信息(少於63個字元)。     Delphi中的實現     通過上面的介紹中,我們不難看出,工作列狀態區的設計主要是處理兩方面的工作:添加、刪除、修改圖示;以及處理通知消息。對於圖示的添加、刪除、修改操作,可以通過調用Shell_NotifyIcon函數來實現。而對於自定義的通知消息,我們就應該在消息迴圈中給予處理了。     下面的示例給出了狀態區圖示的添加、修改和刪除操作的例子,以及圖示的通知消息的基本處理框架。     unit Unit1;    interface    uses   Windows, Messages, SysUtils, Classes, Graphics,   Controls, Forms, Dialogs, ExtCtrls, ShellAPI;    const   WM_TRAYNOTIFY=WM_USER+1;//定義通知消息    type   TForm1 = class(TForm)     Timer1: TTimer;     procedure FormCreate(Sender: TObject);     procedure Timer1Timer(Sender: TObject);     procedure FormDestroy(Sender: TObject);   private     { Private declarations }   public     { Public declarations }     procedure WndProc(var Msg: TMessage); override;   end;    var   Form1: TForm1;   nd0, nd1:NotifyIconData;   hs:array[0..9]of LongWord;    implementation {$R *.DFM}    procedure TForm1.FormCreate(Sender: TObject); begin   //加載Icon0..Icon9這10個圖示資源, 並且保存它們的句柄。   //圖示Icon0..Icon9分別對應與0..9這9個數字。   hs[0]:=LoadIcon(hInstance, 'Icon0');   hs[1]:=LoadIcon(hInstance, 'Icon1');   hs[2]:=LoadIcon(hInstance, 'Icon2');   hs[3]:=LoadIcon(hInstance, 'Icon3');   hs[4]:=LoadIcon(hInstance, 'Icon4');   hs[5]:=LoadIcon(hInstance, 'Icon5');   hs[6]:=LoadIcon(hInstance, 'Icon6');   hs[7]:=LoadIcon(hInstance, 'Icon7');   hs[8]:=LoadIcon(hInstance, 'Icon8');   hs[9]:=LoadIcon(hInstance, 'Icon9');      //填充NotifyIconData記錄型變數nd0   nd0.cbSize := sizeof(NotifyIconData);   nd0.Wnd := handle;   nd0.uID := 0;   nd0.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;   nd0.uCallbackMessage := WM_TRAYNOTIFY;   nd0.hIcon := hs[0];   StrPLCopy(nd0.szTip, 'Hello, World!', 63);      //填充NotifyIconData記錄型變數nd1   nd1.cbSize := sizeof(NotifyIconData);   nd1.Wnd := handle;   nd1.uID := 1;   nd1.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;   nd1.uCallbackMessage := WM_TRAYNOTIFY;   nd1.hIcon := hs[0];   StrPLCopy(nd1.szTip, 'Simon Loves Daisy', 63);      //在工作列狀態區添加圖示   Shell_NotifyIcon(NIM_ADD, @nd0);   Shell_NotifyIcon(NIM_ADD, @nd1); end;    procedure TForm1.Timer1Timer(Sender: TObject); var   st:SystemTime; begin   //每秒鐘更新一次圖示:圖示0顯示秒數的十位, 圖示1顯示秒數的個位。   GetLocalTime(st);   nd0.hIcon := hs[st.wSecond div 10];   nd1.hIcon := hs[st.wSecond mod 10];   //修改工作列狀態區的圖示   Shell_NotifyIcon(NIM_MODIFY, @nd0);   Shell_NotifyIcon(NIM_MODIFY, @nd1); end;    procedure TForm1.FormDestroy(Sender: TObject); begin   //將圖示從工作列狀態區刪除   Shell_NotifyIcon(NIM_DELETE, @nd0);   Shell_NotifyIcon(NIM_DELETE, @nd1); end;    //處理 通知消息 procedure TForm1.WndProc(var Msg: TMessage); var   IconID:integer;   pt:TPOINT; begin   if msg.Msg = WM_TRAYNOTIFY then   begin   {   在通知消息中,wParam參數為圖示的uID,   lParam參數為鼠標事件的類型。   }     iconID := msg.WParam;     //獲取鼠標的在螢幕上的位置     GetCursorPos(pt);      //通知消息的處理的基本框架結構如下:     case msg.lParam of       WM_LBUTTONDOWN:       begin         //鼠標右鍵被按下       end;       WM_RBUTTONDOWN:       begin         //鼠標左鍵被按下       end;       WM_LBUTTONUP:       begin         //釋放鼠標左鍵       end;       WM_RBUTTONUP:       begin         //釋放鼠標右鍵       end;       WM_MOUSEMOVE:       begin         //鼠標在圖示上移動       end;       WM_LBUTTONDBLCLK:       begin         //鼠標左鍵雙擊       end;       WM_RBUTTONDBLCLK:       begin         //鼠標右鍵雙擊       end;     end; //end case   end   else//調用父類的WndProc方法處理其它消息     inherited; end;    end.     發表是最好的記憶!
系統時間:2024-04-27 2:26:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!