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 } 
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

相關文章
相關標籤/搜索