現在很多的應用程序都有這樣一種功能,當用戶選擇最小化窗口時,窗口不是象平常那樣最小化到任務欄上,而是“最小化”成一個任務欄圖標。象FoxMail
3.0 NetVampire
3.0等都提供了這樣的功能。實現這樣的功能實際上並不復雜,在窗口最小化時,窗口會發出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化時隱藏窗口並調用WindowsAPI函數Shell_NotifyIcon將定義的圖標添加到任務欄上,Shell_NotifyIcon的函數定義是這樣的:function
Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall;
其中的參數dwMessage指定Shell_NotifyIcon函數的操作,可以是NIM_ADD NIM_DELETE
NIM_MODIFY三個值中的一個,分別對應添加圖標、刪除圖標、修改圖標的動作。
---- 參數lpData指向的PNotifyIconData結構的定義如下:
_NOTIFYICONDATAW =
record
cbSize: DWORD;
Wnd: HWND;
uID: UINT;
uFlags:
UINT;
uCallbackMessage: UINT;
hIcon: HICON;
szTip: array
[0..63] of WideChar;
end;
TNotifyIconData = _NOTIFYICONDATAW;
----
在這個結構中Wnd指明所屬的窗口,UCallbackMessage指明回調消息,如果指明了Wnd和
uCallbackMessage,則當用戶對任務欄圖標有動作(如點擊圖標,在圖標上移動光標等)。系統都會發送uCallbackMessage消息給Wnd指定的窗口。hIcon是要添加的圖標的句柄,szTip
是圖標的提示行(就是當移動光標到圖標上,出現的一個小黃方框內出現的文字)。消息。實現上面的功能,最主要的是要處理WM_SYSCOMMAND消息和自定義的圖標消息,這些消息在Delphi中並沒有相應的事件。這里就需要使用到Delphi的自定義消息處理功能來截取並處理這些消息。
----
首先看下面的程序。在執行程序之前,首先要改變Form1的Icon屬性,給Form1裝入一個圖標,否則在任務欄上會出現一塊空白。
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI; const WM_BARICON=WM_USER+200; type TForm1 = class(TForm) private procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND; procedure WMBarIcon(var Message:TMessage);message WM_BARICON; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMSysCommand (var Message:TMessage); var lpData:PNotifyIconData; begin if Message.WParam = SC_ICON then begin //如果用戶最小化窗口則將窗口隱藏並在任務欄上添加圖標 lpData := new(PNotifyIconDataA); lpData.cbSize := 88; //SizeOf(PNotifyIconDataA); lpData.Wnd := Form1.Handle; lpData.hIcon := Form1.Icon.Handle; lpData.uCallbackMessage := WM_BARICON; lpData.uID :=0; lpData.szTip := 'Samples'; lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; Shell_NotifyIcon(NIM_ADD,lpData); dispose(lpData); Form1.Visible := False; end else begin //如果是其它的SystemCommand 消息則調用系統缺省處理函數處理之。 DefWindowProc(Form1.Handle,Message. Msg,Message.WParam,Message.LParam); end; // end; procedure TForm1.WMBarIcon(var Message:TMessage); var lpData:PNotifyIconData; begin if (Message.LParam = WM_LBUTTONDOWN) then begin //如果用戶點擊任務欄圖標則將圖標刪除並回復窗口。 lpData := new(PNotifyIconDataA); lpData.cbSize := 88;//SizeOf(PNotifyIconDataA); lpData.Wnd := Form1.Handle; lpData.hIcon := Form1.Icon.Handle; lpData.uCallbackMessage := WM_BARICON; lpData.uID :=0; lpData.szTip := 'Samples'; lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; Shell_NotifyIcon(NIM_DELETE,lpData); dispose(lpData); Form1.Visible := True; end; end; end.
----
運行上面的程序,點擊程序窗口標題欄上的最小化按鈕,你就可以看到窗口被“最小化”成了一個任務欄圖標,點擊圖標,窗口又會恢復原來的狀態。
----
從上面的程序可以看到,Delphi的自定義消息處理功能的實現也是十分簡單的,首先在Form類的Private定義中加入自定義消息處理函數的定義,定義的描述如下:
procedure UserPro(Var Message: TMessage):message
WindowsMessage 其中UserPro是用戶自定義消息處理函數的名稱,
WindowsMessage 是Windows消息常量或自定義消息常量。
---- 然后在程序中加入消息處理函數,函數的一般格式如下:
Procedure UserClass.UserPro(Var Message:TMessage);
var
//加入定義
Begin
//加入程序語句
End;
其中UserClass是封裝自定義消息處理函數的類的名稱。
----
最后,Delphi的自定義消息處理函數要涉及到Windows的消息的結構,在這里我就不多說了,大家可以參考Windows
API幫助和Delphi的相關幫助信息。相信大家如果掌握了Delphi的自定義消息處理函數,一定可以編寫出象VB一樣簡潔,象C++一樣功能強大的程序來的。
http://www.cnblogs.com/key-ok/p/4594662.html