明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Delphi自定義消息應(yīng)用一例

[摘要]---- 現(xiàn)在很多的應(yīng)用程序都有這樣一種功能,當(dāng)用戶(hù)選擇最小化窗口時(shí),窗口不是象平常那樣最小化到任務(wù)欄上,而是“最小化”成一個(gè)任務(wù)欄圖標(biāo)。象FoxMail 3.0 NetVampire 3.0等都提供了這樣的功能。實(shí)現(xiàn)這樣的功能實(shí)際上并不復(fù)雜,在窗口最小化時(shí),窗口會(huì)發(fā)出WM_SYSCOMMAND消...
---- 現(xiàn)在很多的應(yīng)用程序都有這樣一種功能,當(dāng)用戶(hù)選擇最小化窗口時(shí),窗口不是象平常那樣最小化到任務(wù)欄上,而是“最小化”成一個(gè)任務(wù)欄圖標(biāo)。象FoxMail 3.0 NetVampire 3.0等都提供了這樣的功能。實(shí)現(xiàn)這樣的功能實(shí)際上并不復(fù)雜,在窗口最小化時(shí),窗口會(huì)發(fā)出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化時(shí)隱藏窗口并調(diào)用WindowsAPI函數(shù)Shell_NotifyIcon將定義的圖標(biāo)添加到任務(wù)欄上,Shell_NotifyIcon的函數(shù)定義是這樣的:function Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall; 其中的參數(shù)dwMessage指定Shell_NotifyIcon函數(shù)的操作,可以是NIM_ADD NIM_DELETE NIM_MODIFY三個(gè)值中的一個(gè),分別對(duì)應(yīng)添加圖標(biāo)、刪除圖標(biāo)、修改圖標(biāo)的動(dòng)作。  

---- 參數(shù)lpData指向的PNotifyIconData結(jié)構(gòu)的定義如下:  

_NOTIFYICONDATAW = record
    cbSize: DWORD;
    Wnd: HWND;
    uID: UINT;
    uFlags: UINT;
    uCallbackMessage: UINT;
    hIcon: HICON;
    szTip: array [0..63] of WideChar;
  end;

  TNotifyIconData = _NOTIFYICONDATAW;
---- 在這個(gè)結(jié)構(gòu)中Wnd指明所屬的窗口,UCallbackMessage指明回調(diào)消息,如果指明了Wnd和 uCallbackMessage,則當(dāng)用戶(hù)對(duì)任務(wù)欄圖標(biāo)有動(dòng)作(如點(diǎn)擊圖標(biāo),在圖標(biāo)上移動(dòng)光標(biāo)等)。系統(tǒng)都會(huì)發(fā)送uCallbackMessage消息給Wnd指定的窗口。hIcon是要添加的圖標(biāo)的句柄,szTip 是圖標(biāo)的提示行(就是當(dāng)移動(dòng)光標(biāo)到圖標(biāo)上,出現(xiàn)的一個(gè)小黃方框內(nèi)出現(xiàn)的文字)。消息。實(shí)現(xiàn)上面的功能,最主要的是要處理WM_SYSCOMMAND消息和自定義的圖標(biāo)消息,這些消息在Delphi中并沒(méi)有相應(yīng)的事件。這里就需要使用到Delphi的自定義消息處理功能來(lái)截取并處理這些消息。  

---- 首先看下面的程序。在執(zhí)行程序之前,首先要改變Form1的Icon屬性,給Form1裝入一個(gè)圖標(biāo),否則在任務(wù)欄上會(huì)出現(xiàn)一塊空白。  

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
     //如果用戶(hù)最小化窗口則將窗口
     隱藏并在任務(wù)欄上添加圖標(biāo)
     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
     消息則調(diào)用系統(tǒng)缺省處理函數(shù)處理之。
     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
     //如果用戶(hù)點(diǎn)擊任務(wù)欄圖標(biāo)則將圖標(biāo)刪除并回復(fù)窗口。
     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.
---- 運(yùn)行上面的程序,點(diǎn)擊程序窗口標(biāo)題欄上的最小化按鈕,你就可以看到窗口被“最小化”成了一個(gè)任務(wù)欄圖標(biāo),點(diǎn)擊圖標(biāo),窗口又會(huì)恢復(fù)原來(lái)的狀態(tài)。  

---- 從上面的程序可以看到,Delphi的自定義消息處理功能的實(shí)現(xiàn)也是十分簡(jiǎn)單的,首先在Form類(lèi)的Private定義中加入自定義消息處理函數(shù)的定義,定義的描述如下:  

procedure UserPro(Var Message:
TMessage):message WindowsMessage
其中UserPro是用戶(hù)自定義消息處理函數(shù)的名稱(chēng),
WindowsMessage是Windows消息常量或自定義消息常量。
---- 然后在程序中加入消息處理函數(shù),函數(shù)的一般格式如下:  

    Procedure UserClass.UserPro(Var Message:TMessage);
    var
//加入定義
    Begin
//加入程序語(yǔ)句
    End;
    其中UserClass是封裝自定義消息處理函數(shù)的類(lèi)的名稱(chēng)。
---- 最后,Delphi的自定義消息處理函數(shù)要涉及到Windows的消息的結(jié)構(gòu),在這里我就不多說(shuō)了,大家可以參考Windows API幫助和Delphi的相關(guān)幫助信息。相信大家如果掌握了Delphi的自定義消息處理函數(shù),一定可以編寫(xiě)出象VB一樣簡(jiǎn)潔,象C++一樣功能強(qiáng)大的程序來(lái)的。