如今不少的應用程序都有這樣一種功能,當用戶選擇最小化窗口時,窗口不是象日常那樣最小化到任務欄上,而是「最小化」成一個任務欄圖標。象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++同樣功能強大的程序來的。 web