托盤程式的實現(delphi的訊息處理函式)
我的程式碼如下,可是報錯。。
const my_message=wm_user+100;
....
procedure xxxx(var msg:TMessage); message my_message;////---這裡報錯。。
....
procedure xx(var msg:Tmessage)
begin
....
end;
謝謝了, 問題點數:100、回覆次數:6Top
1 樓yelook(香檳酒)回覆於 2003-01-16 16:54:24 得分 30
procedure xx(var msg:Tmessage)
begin
....
end;
改為
procedure 類名.xx(var msg:Tmessage)
begin
....
end;
2 樓xzgyb(老達摩)回覆於 2003-01-16 16:57:30 得分 20
TForm1 = class(TForm)
public
...
procedure xxxx(var msg:TMessage); message my_message;
end;
procedure TForm1.xxxx(var msg:TMessage);
begin
...
end;
訊息處理函式必須作到一個類裡面Top
3 樓cg1120(程式碼最優化-§惟堅韌者始能遂其志§) 回覆於 2003-01-16 16:57:51 得分 15
procedure TFORM1.xx(var msg:Tmessage)
begin
....
end;
Top
4 樓Drate(小蟲(好好學習,天天向上))回覆於 2003-01-16 17:00:33 得分 35
同意樓上的:
[轉帖]
Delphi自定義訊息應用一例
作者: 評價: 上站日期: 2001-09-05
內容說明:
來源:
--------------------------------------------------------------------------------
現在很多的應用程式都有這樣一種功能,當用戶選擇最小化視窗時,視窗不是象平常那樣最小化到工作列上,而是“最小化”成一個工作列圖示。象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++一樣功能強大的程式來的。
5 樓lanble()回覆於 2003-01-16 19:04:17 得分 0
各位大哥,也是寫在類裡面的,(注用DELPHI6),報錯資訊如下:
unkown directive 'message',是不是少引用了某個單元?Top
6 樓xiaole51(善良的賊)回覆於 2003-02-18 16:36:17 得分 0
uses 部分是不是沒引用Messages