Delphi对消息的处理.doc_第1页
Delphi对消息的处理.doc_第2页
Delphi对消息的处理.doc_第3页
Delphi对消息的处理.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi中对消息的处理 刘文彦 张 翔 (吉林化工学院)摘要:本文对覆盖消息和自定义消息的处理方法进行讨论,总结出两类消息处理的步骤, 并通过例程加以实现。关键词:Delphi; 消息; 通讯1. 引言 在Windows操作系统中,可以同时运行多个应用程序,并且保持相对的独立性。Windows和应用程序之间是通过发送消息的方法互相联系。Windows为每一个应用程序建立一个消息队列,当应用程序执行某一操作时,将产生相应的消息事件,Windows将事件放入消息队列中等候应用程序取走,应用程序取走消息后,将执行相应程序命令,处理完毕后再取下一条消息。同时,消息也可以在不同的应用程序中进行传递,这就保证了应用程序之间的相互联系和通讯。2.消息分析 处理Windows发往各个应用程序的消息是Windows编程的重要内容之一,深刻了解消息的处理方法是编写一个好的应用程序的重要基础。Delphi中提供了对消息的处理方法,并把Windows中的消息转化为自己的组件。消息的处理过程见图1。发送消息应用程序事件 过滤消息处理消息事件 图1 在Delphi中处理Windows预定义的消息通常叫覆盖消息,另一类是自定义消息。Windows在消息处理过程中为每一个消息确定了一个消息索引号,其范围是149151。Windows保留了11024范围。所以,覆盖消息的索引号在11024范围内,而自定义的消息就不要与预定义的消息发生冲突。下面对两类消息的处理方法做一说明。2.1 覆盖消息 覆盖消息是将Windows预定义的消息进行覆盖。覆盖消息的原理是通过给新的消息处理方法赋予原消息索引号。这样,当某个事件产生消息的发生事件时,根据其索引号得到新的消息处理方法。覆盖消息的处理步骤:1)确定所需处理的消息 确定消息是确定覆盖的系统消息,不同的事件有不同的消息,例如:鼠标单击窗口中的标题栏(窗口中的蓝色彩条)所产生的消息是WM_SYSCOMMAND。2)在程序中声明所处理的消息(覆盖原消息)在派生类的protected部分声明消息处理方法,此方法必须是过程:例如:Procedure mymessage(var msg:Tmessage); message WM_messageindex; 在protected中声明主要是在该类的封装时将其私有化(只允许该类使用),mymessage为此消息的过程名,用关键字message将WM_messageindex的索引号分配给mymessage,即覆盖WM_messageindex消息。WM_messageindex可以是前面提到的WM_SYSCOMMAND消息。3)编写消息处理过程 在程序的implementation部分编写消息的实现代码。具体如下: Procedure mymessage(var msg:Tmessage); Begin /所要执行的具体内容。 End;2.2 自定义消息 自定义消息是声明Windows没有预定义的消息,因为不是预定义的消息,所以要编写程序,发送消息。而且用户可以定义一些本消息自带的参数。通过自定义消息,作者可以编写具有特色的应用程序。 自定义消息的步骤:1)声明消息的索引号 前面已经提到了消息索引号的范围以及分配情况。在Delphi中常量WM_USER=1024可以用做自定义消息索引号的起始值,如: const WM_mymessage=WM_USER+$100; 但要注意的是一些Windows的标准组件已经占用了1024以外的索引号,为了避免这样的冲突,在Delphi中有另处一个常量WM_APP=32768,建议自定义消息的索引号以WM_APP为起点,如: const WM_mymessage=WM_APP+$1002)定义消息记录类型 在定义完消息的索引号后,还需要定义消息的记录类型。消息记录类型是传送给消息处理方法的参数结构类型。整个消息记录类型共128bits。定义消息记录类型时记录大小不能超出此范围。下面是一个消息记录类型的例子:Type TWMmymessage=record Msg:Cardinal;/该记录对应的消息。 Name:DWORD;/对应参数wParam Time:DWORD;/对应参数1Param; Result:Longint;end;3)在程序中声明所处理的消息 声明消息的方法和声明覆盖消息的方法是相同的,使用规则也是一样的。4)编写消息处理过程 和前面提到的覆盖消息处理过程方法一样,可以参考前面的例子进行编写。5)发送自定义消息 自定义消息不是通过系统发生的某一件事所产生,而是需要我们自己发送到消息队列中。这就涉及到消息的发送问题,在用户发送消息时可以使用下面两个Windows的API函数: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 1Param); BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM 1Param);3. 应用程序设计3.1 程序实例 下面是该程序的部分代码:unit Unit1;interfaceuses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs, shellapi,StdCtrls;/因为要用到Windows/API函数所以在此声明Shellapi/定义消息索引号const WM_mymessage=WM_USER+$100;/定义消息类型Type TWMmymessage=record Msg:Cardinal;/该记录对应的消息。 Name:DWORD;/对应参数wParam Time:DWORD;/对应参数1Param; Result:Longint; end;type TForm1=class(TForm) Label1:TLabel; label2:TLabel; wp:TLabel; lp:TLabel; Button1:TButton; Button2:TButton; Edit1:TEdit; Edit2:TEdit; Procedure Button1Click(Sender:TObject); Procedure Button2Click(Sender:TObject); private Private declarations procedure mytitlemessage(var msg:TWmsyscommand);messageWM_SYSCOMMAND; Procedure myownermessage(var msg:tWMmymessage);messageWM_mymessage);messageWM_mymessage; public Public declarations end;var Form1:TForm1;implementation$R*.DFM/覆盖消息的处理过程procedure Tform1.mytitlemessage(var msg:TWmsyscommand);begin /得到消息的参数 case msg.CmdType of SC_CLOSE:showmessage (您单击了关闭按扭);/按了关闭按扭 SC_MAXIMIZE:showmessage (您单击了最大化按扭);/按了最大化按扭 SC_MINIMIZE:showmessage (您单击了最小化按扭);/按了最小化按扭 end; inherited;end;/自定义消息处理procedure Tform1.myownermessage(var msg:TWMmymessage);begin /得到消息的参数 wp.Caption:=inttostr(); lp.caption:=inttostr(msg.time);end;/用sendmessage函数发送消息procedure TForm1.Button1Click(Sender:TObject);var hwn:hwnd;begin /得到当前窗口的句柄 hwn:=findwindow(tform1,消息处理); /其中edit1.text、edit2.text为所要传递/消息的参数Sendmessage(hwn,cardinal(WM_mymessage),strtoint(edit1.text),strtoint(edit2.text);end;/用postmessage函数传递消息procedure Tform1.Button2Click(Sender:TObject);var hwn:hwnd;begin /得到当前窗口的句柄 hwn:=findwindow(tform1,消息处理); /其中edit1.text、edit2.text为所要传递/消息的参数 postmessage(hwn,cardinal(WM_mymessage), strtoint(edit1.text),strtoint(edit2.text); end;end.3.2 程序说明 该程序实现对标题栏单击事件所产生的消息覆盖,当用户单击标题栏的三个按扭时,弹出对话框提示用户操作。 本程序已在Delphi 5.0和Windows 98中调试通过。4. 结论 1)应用程序中有许多需要处理的消息,只要知道消息的索引号就可以对发向本应用程序的消息进行特殊的处理,然后返回其默认的消息参数。比如Windows系统中的关闭操作,向各个应用程序发送的消息是WM-QUERYENDSESSION,这样可以在应用程序中覆盖这个消息来完成关闭程序所需要完成的工作,不影响Windows的正常关闭,而且返回其适当的值可以禁止

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论