---- 現在很多的應用程式都有這樣一種功能,當使用者選擇最小化視窗時,視窗不是象平常那樣最小化到工作列上,而是“最小化”成一個工作列圖示。象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 }
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand
(var Message:TMessage);
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
//如果使用者最小化視窗則将視窗
隐藏并在工作列上添加圖示
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
//如果是其它的SystemCommand
消息則調用系統預設處理函數處理之。
DefWindowProc(Form1.Handle,Message.
Msg,Message.WParam,Message.LParam);
//
procedure TForm1.WMBarIcon(var Message:TMessage);
if (Message.LParam = WM_LBUTTONDOWN) then
//如果使用者點選工作列圖示則将圖示删除并回複視窗。
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
Form1.Visible := True;
end.
---- 運作上面的程式,點選程式視窗标題欄上的最小化按鈕,你就可以看到視窗被“最小化”成了一個工作列圖示,點選圖示,視窗又會恢複原來的狀态。
---- 從上面的程式可以看到,Delphi的自定義消息處理功能的實作也是十分簡單的,首先在Form類的Private定義中加入自定義消息處理函數的定義,定義的描述如下:
procedure UserPro(Var Message:
TMessage):message WindowsMessage
其中UserPro是使用者自定義消息處理函數的名稱,
WindowsMessage是Windows消息常量或自定義消息常量。
---- 然後在程式中加入消息處理函數,函數的一般格式如下:
Procedure UserClass.UserPro(Var Message:TMessage);
//加入定義
Begin