1、windows的消息驱动体系
在windows系统中,消息传递是实现对乡间通信和控制的主要手段。可以额系统都以消息驱动的方式工作。系统中发生的用户输入操作、显示信息的改变、系统环境参数变化等所有时间都以系统定义消息的形式出现在相关的应用程序和窗口。所以程序设计的主要任务就是为这些消息的处理设计代码。
在应用程序中,发送者可以通过发送消息要求接收者完成相应的处理。当程序运行时,windows系统为每个应用程序实例建立一个消息队列,一次保存发送给该程序实例的消息,在应用程序的主控部分,需要设置一个消息循环,利用一组系统函数从该程序实例的消息队列中依次读取和分析消息,并将他们发送给指定的消息。这种消息传递可以使用系统定义消息,也可以使用用户自定义的消息。现有的多种可视化开发环境,都已经将这一过程封装到了各种类,部件,以及部件的方法中。
当我们利用它们写一个应用程序时,必须考虑每个对象要做什么,将他们分解为不同的消息处理函数,并且对应不同的消息。虽然有的控件(部件)种类繁多,编写程序非常便利。但这些毕竟是一些通用的对象和消息处理函数,如果我们要编写自己的部件或者想要更加灵活的运用现有控件就必须深刻了解消息驱动体系以及消息的映射,消息处理函数编写和系统有关消息操作的函数。
2、DELPHI开发环境:
DELPHI已成为日益普及的优秀的32位WINDOWS开发环境,其中一个最大的特点就是在DELPHI 中可自定义消息写自己的构件(Cmponent)的,因为编写构件一般要对相应的消息进行处理.。
3、DELPHI中的消息:
在Delphi 中所有的类都有一个内建的用于处理消息、调用消息处理过程的机制。VCL定义了发送所有WINDOWS消息(包括自定义消息)的消息派送系统,你只需要建立消息处理方法。一个Windows 消息是一个包含多个字段的数据记录。其中最重要的是消息标识,在WINDOWS中已经定义了许多消息其他有用的字段是两个参数和一个结果字段。一个16位和一个32位参数wparan录数据类型:
typeTMessage = packed recordMsg: Cardinal;case Integer of0: (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方法.(当然如果要屏蔽掉此消息了)。
(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)消息处理句柄方法声明为:
procedure Mymsgmethod(var message:Tmessage); message Msgtype;
同样用户也可以定义自己的消息自定义消息及消息处理句柄举例如下:
const my_paint=Wm_user+1;typeTmypaint=recordmsgid:cardinal;msize:word;mcolor:longint;msgresult:longint;end; //也可以使用Tmessage类型typeTmycontrol=class(TCustomControl)protectedprocedure change(var message:Tmypaint); message my_paint;.....end;......procedure Tmycontrol.change(var message:Tmypaint);beginsize:=message.msize; { 设 置Tmybutton 尺 寸 属 性}color:=message.mcolor; { 设 置Tmybutton 颜 色 属 性}{do something else}inherited; { 交 由Tcustomcontrol 处 理}end;(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)
重载消息句柄方法:你可以直接重载windows定义的窗口消息添加自己的处理。例如在应用中重载windows的窗口消息wm_paint:
typeTMyComponent = 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);beginif On thenWindowProc := SubClassWndProc;elseWindowProc := WndProc;end;
(4)function Perform(Msg: Cardinal; WParam这个函数用来向控件自己发一个消息。
例如:
procedure TForm1.Button1Click(Sender: TObject);beginwith RichEdit1 doBeginSelStart := StrToInt(MaskEdit1.Text);RichEdit1.Perform(EM_SCROLLCARETend;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;这个函数用于将消息传送到窗口的消息队列。