天天看點

Delphi 最小化窗體到托盤

---- 現在很多的應用程式都有這樣一種功能,當使用者選擇最小化視窗時,視窗不是象平常那樣最小化到工作列上,而是“最小化”成一個工作列圖示。象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