Delphi中的消息处理

1、windows的消息驱动体系 
  在windows系统中,消息传递是实现对乡间通信和控制的主要手段。可以额系统都以消息驱动的方式工作。系统中发生的用户输入操作、显示信息的改变、系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口。所以程序设计的主要任务就是为这些消息的处理设计代码。

  在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理。当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一个消息循环,利用一组系统函数从该程序实例的消息队列中依次读取和分析消息,并将他们发送给指定的消息。这种消息传递可以使用系统定义消息,也可以使用用户自定义的消息。现有的多种可视化开发环境,都已经将这一过程封装到了各种类,部件,以及部件的方法中。

  当我们利用它们写一个应用程序时,必须考虑每个对象要做什么,将他们分解为不同的消息处理函数,并且对应不同的消息。虽然有的控件(部件)种类繁多,编写程序非常便利。但这些毕竟是一些通用的对象和消息处理函数,如果我们要编写自己的部件或者想要更加灵活的运用现有控件就必须深刻了解消息驱动体系以及消息的映射,消息处理函数编写和系统有关消息操作的函数。 
2、DELPHI开发环境: 
  DELPHI已成为日益普及的优秀的32位WINDOWS开发环境,其中一个最大的特点就是在DELPHI 中可自定义消息写自己的构件(Cmponent)的,因为编写构件一般要对相应的消息进行处理.。 
3、DELPHI中的消息: 
  在Delphi 中所有的类都有一个内建的用于处理消息、调用消息处理过程的机制。VCL定义了发送所有WINDOWS消息(包括自定义消息)的消息派送系统,你只需要建立消息处理方法。一个Windows 消息是一个包含多个字段的数据记录。其中最重要的是消息标识,在WINDOWS中已经定义了许多消息其他有用的字段是两个参数和一个结果字段。一个16位和一个32位参数wparan录数据类型:

type 
TMessage = packed record 
Msg: Cardinal; 
case Integer of 
0: ( 
WParam: Longint; 
LParam: Longint; 
Result: Longint); 
1: ( 
WParamLo: Word; 
WParamHi: Word; 
LParamLo: Word; 
LParamHi: Word; 
esultLo: Word; 
ResultHi: Word); 
end;

4、消息的使用: 
  在DELPHI 中用户可以自定义消息及消息处理句柄消息处理句柄的定义有如下几个原则:

  1、消息处理句柄方法必须是一个过程 
  2、方法声明后要有一个message命令型常数). 
  3、消息处理句柄方法不需要用override 命令来显式指明重载祖先的一个消息处理句柄 
  4、在消息处理句柄中一般先是用户自己对消息的处理用祖先类中对应此消息的处理句柄(有些情况下可能正相反).由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚避免此麻烦调用Defaulthandler方法.(当然如果要屏蔽掉此消息了)。

消息处理句柄方法声明为:

procedure Mymsgmethod(var message:Tmessage); message Msgtype;

同样用户也可以定义自己的消息自定义消息及消息处理句柄举例如下:

const my_paint=Wm_user 1; 
type 
Tmypaint=record 
msgid:cardinal; 
msize:word; 
mcolor:longint; 
msgresult:longint; 
end; //也可以使用Tmessage类型 
type 
Tmycontrol=class(TCustomControl) 
protected 
procedure change(var message:Tmypaint); message my_paint; 
..... 
end; 
...... 
procedure Tmycontrol.change(var message:Tmypaint); 
begin 
size:=message.msize; { 设 置Tmybutton 尺 寸 属 性} 
color:=message.mcolor; { 设 置Tmybutton 颜 色 属 性} 
{do something else} 
inherited; { 交 由Tcustomcontrol 处 理} 
end;

  重载消息句柄方法:你可以直接重载windows定义的窗口消息添加自己的处理。例如在应用中重载windows的窗口消息wm_paint:

type 
TMyComponent = class(...) 
... 
procedure WMPaint(var Message: TWMPaint); message WM_PAINT; 
end;

  然后再实现部分添加消息句柄的过程。 
5、delphi中有关消息的重要函数和属性:

(1) procedure DefaultHandler(var Message); virtual; 
如果一个对象处理某个消息,则该函数提供对消息的默认处理。 
(2) procedure Dispatch(var Message); virtual; 
这个函数用于调用对象的消息处理函数。 
(3)Windowproc属性: 
type TWndMethod = procedure(var Message: TMessage) of object; 
property WindowProc: TWndMethod;

  这个属性用于指定一个函数,用这个函数来响应message参数指定的windows消息。例如:

procedure TMyListBoxDescendant.ToggleSubClass(On: Boolean); 
begin 
if On then 
WindowProc := SubClassWndProc; 
else 
WindowProc := WndProc; 
end;

(4)function Perform(Msg: Cardinal; WParam这个函数用来向控件自己发一个消息。 
例如:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
with RichEdit1 do 
Begin 
SelStart := StrToInt(MaskEdit1.Text); 
RichEdit1.Perform(EM_SCROLLCARET 
end; 
end;

(5)procedure Broadcast(var Message);这个函数用于向所有的子控件广播一个消息。 
(6)procedure DefaultHandler(var Message); virtual;该函数提供了队所有消息的默认处理,可以重载这个虚拟函数。Message参数是无类型的,但可以强制转换成Tmessage类型。

6、windows API中有关消息的几个重要函数:

(1)GetMessage函数: 
BOOL GetMessage(LPMSG lpMsg HWND hWnd 
UINT wMsgFilterMin UINT wMsgFilterMax// 最后的消息); 
delphi中的定义: 
function GetMessageA(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin 
这个函数可以有选择的从消息队列重得到消息。 
(2)TranslateMessage函数: 
BOOL TranslateMessage(CONST MSG *lpMsg // 消息的地址); 
delphi中的定义: 
function TranslateMessage(const lpMsg: TMsg): BOOL; stdcall; 
这个函数用于将virtul-key消息翻译为字符消息。 
(3)DispatchMessage函数: 
LONG DispatchMessage(CONST MSG *lpmsg // 消息的指针); 
delphi中的定义: 
function DispatchMessage(const lpMsg: TMsg): Longint; stdcall; 
这个函数派送消息到窗口过程。 
(4)PostMessage函数: 
BOOL PostMessage(HWND hWnd UINT Msg WPARAM wParam 
LPARAM lParam // 第二个消息参数); 
delphi中的定义: 
function PostMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;这个函数用于将消息传送到窗口的消息队列。

转自:http://www.cnblogs.com/railgunman/articles/1790078.html

时间: 2024-12-14 18:42:30

Delphi中的消息处理的相关文章

DELPHI中的消息处理机制

DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,Powerpoint等)中脱颖而出.其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接

Delphi中window消息截获的实现方式(2)

Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,Powerpoint等)中脱颖而出.其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接处理消息.这对于那些希望编写自

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

Delphi中编写OwnerDraw方式按钮的方法以及注意点

{在Win32标准控件库中(comctl32.dll)的控件绝大部分的控件都支持自画(OwnerDraw)功能的设置,这里以按钮为例子说说此类控件在delphi中的编写方式以及应该注意的问题!由于标准的按钮都有一套规定的外观标准(由windows的comctl32.dll中的代码绘制),为了给用户一个自己绘制控件的机会,多数的控件都支持在创建的时候设置一个标志来告诉系统这个控件需要自己绘制,例如按钮中有:BS_OWNERDRAW,菜单的有:MF_OWNERDRAW等等(还有诸如:ComboBox

Delphi中的关键字与保留字

Delphi中的关键字与保留字 分类整理 Delphi 中的“关键字”和“保留字”,方便查询 感谢原作者的收集整理! 关键字和保留字的区别在于,关键字不推荐作标示符(编译器已经内置相关函数或者留给保留实现),二保留字是根本不可能作标示符(编译时有警示!) [系统保留字] and            array          as             asm begin          case           class          const constructor   

转:Delphi中使用比较少的一些语法

http://www.cnblogs.com/Murphieston/p/5577836.html 本文是为了加强记忆而写,这里写的大多数内容都是在编程的日常工作中使用频率不高的东西,但是又十分重要. ---Murphy 1,构造和析构函数: a,构造函数: 一般基于TComponent组件的派生类,都应该使用overload关键字进行继承,Delphi中的对象没有什么复合的概念,在设计时,从简便的角度出发 一般都设计为耦合性较强,但是使用简单的派生类即可.构造函数不是必写的,除非“复合”这样的

Delphi中destroy, free, freeAndNil, release用法和区别

Delphi中destroy, free, freeAndNil, release用法和区别 1)destroy:虚方法 释放内存,在Tobject中声明为virtual,通常是在其子类中override 它,且要加上inherited关键字,才能保证派生类对象正确地被销毁;但destroy一般不能直接用,为什么?当一个对象为nil,我们仍然调用destroy,会产生错误.因为destroy是虚方法,它要根据对象中的头四个字节找到虚拟方法表Vmt的入口地址,从而找到destroy的入口地址,所以

Delphi中SendMessage使用说明 good

Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回. 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam): 参数: hWnd:其窗口程序将接收消息的窗口的句柄.如果此参数为HWND_BRO

delphi中SendMessage使用说明

SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回. 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam): 参数: hWnd:其窗口程序将接收消息的窗口的句柄.如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗