程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi自定義消息應用一例

Delphi自定義消息應用一例

編輯: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++一樣功能強大的程序來的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved