学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> Delphi >> Delphi中的消息处理


Delphi中的消息处理


p>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;这个函数用于将消息传送到窗口的消息队列。



技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"Delphi中的消息处理"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 Delphi中的消息处理 相关内容
Google搜索中 Delphi中的消息处理 相关内容
雅虎中 Delphi中的消息处理 相关内容
Sogou搜索中 Delphi中的消息处理 相关内容

相关软件 最新回复帖子:

·Windows Vista 中卸载软件的不同方式
·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效


  相关软件 Delphi中的消息处理相关文章
在DEPHI程序中使用ADO对象存取ODBC数续 在DELPHI程序中使用ADO对象存取ODBC数
在DELPHI程序中动态设置ODBC数据源 精简DELPHI数据库系统的补充
如何对数据流 INSERT、APPEND 定制任务栏上的系统菜单
活用 SetSelTextBuf 捕捉来自 Thread 的异常
在DEPHI 4.0中实现动画功能 修改与克隆对象属性
控制系统菜单 怎样建立简单的任务栏应用程序
用修改文件时间的方法来加密文件 用Dephi程序维护Paradox 数据表的索引
有“背景”的窗体 自定义快速报表的打印预览窗口
用Delphi实现自定义颜色对话框及其构件 Delphi实用编程经验二则