社区
Delphi
帖子详情
Window 消息大全使用详解
IORILI
2003-09-19 02:12:55
加精
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,(我转贴的)
...全文
88
50
打赏
收藏
Window 消息大全使用详解
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,(我转贴的)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
50 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yplin
2003-10-06
打赏
举报
回复
f
mib3000
2003-10-05
打赏
举报
回复
收藏,慢慢研究
Rabbit8
2003-09-30
打赏
举报
回复
Mark
icdt2
2003-09-29
打赏
举报
回复
up
microd
2003-09-25
打赏
举报
回复
好人,好帖
同成家长汇
2003-09-25
打赏
举报
回复
up
NetG
2003-09-25
打赏
举报
回复
谢谢~~
ollea
2003-09-25
打赏
举报
回复
蛮好的帖子
IORILI
2003-09-25
打赏
举报
回复
up
up
up
Alanwn
2003-09-23
打赏
举报
回复
终于粘贴完了,查点把下面的这点露掉。
FSU
2003-09-23
打赏
举报
回复
好人呀:)
IORILI
2003-09-22
打赏
举报
回复
Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,Powerpoint等)中脱颖而出.
其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接处理消息.这对于那些希望编写自己的构件(Component),或者希望截获.过滤消息的用户来说是必不可少的.因为编写构件一般要对相应的消息进行处理.下面就对Delphi中消息处理机制进行一下介绍。
一.DELPHIVCL中消息的传递
Delphi中每一个VCL(VisualComponentLibrary)构件(如Tbutton,Tedit等)都有一内在的消息处理机制,其基本点就是构件类接收到某些消息并把它们发送给适当的处理方法,如果没有特定的处理方法,则调用缺省的消息处理句柄。
其中mainwndproc是定义在Twincontrol类中的一个静态方法,不能被重载(Override)。它不直接处理消息,而是交由wndproc方法处理,并为wndproc方法提供一个异常处理模块。Mainwndproc方法声明如下:
procedureMainWndProc(varMessage:TMessage);
Wndproc是在Tcontrol类中定义的一个虚拟方法,由它调用dispatch方法来进行消息的分配,wndproc方法声明如下:
procedureWndProc(varMessage:TMessage);virtual;
dispatch方法是在Tobject根类中定义的,其声明如下:
procedureTobject.dispatch(varMessage);传递给dispatch的消息参数必须是一个记录类型,且这个记录中第一个入点必须是一个cardinal类型的域(field),它包含了要分配的消息的消息号码.例如:
type
Tmessage=record
Msg:cardinal;
wparam:word;
lparam:longint;.
result:longint;
end;
而Dispatch方法会根据消息号码调用构件的最后代类中处理此消息的句柄方法.如果此构件和它的祖先类中都没有对应此消息的处理句柄,Dispatch方法便会调用Defaulthandler方法.Defaulthandler方法是定
义于Tobject中的虚拟方法,其声明如下:
procedureDefaulthandler(varMessage);virtual;
Tobject类中的Defaulthandler方法只是实现简单的返回而不对消息进行任何的处理.我们可以通过对此虚拟方法的重载,在子类中实现对消息的缺省处理.对于VCL中的构件而言,其Defaulthandler方法会启
动windowsAPI函数Defwindowproc对消息进行处理.
二.DELPHI中的消息处理句柄
在DELPHI中用户可以自定义消息及消息处理句柄.消息处理句柄的定义有如下几个原则:
1.消息处理句柄方法必须是一个过程,且只能传递一个Tmessage型变量参数.2.方法声明后要有一个message命令,后接一个在0到32767之间的消息标号(整型常数).3.消息处理句柄方法不需要用override命令来显式指明重载祖先的一个消息处理句柄,另外它一般声明在构件的protected或private区.4.在消息处理句柄中一般先是用户自己对消息的处理,最后用inherited命令调用祖先类中对应此消息的处理句柄(有些情况下可能正相反).由于可能对祖先类中对此消息的处理句柄的名字和参数类型不清楚,而调用命令inherited可以避免此麻烦,同样如果祖先类中没有对应此消息的处理句柄,inherited就会自动调用Defaulthandler方法.(当然如果要屏蔽掉此消息,就不用inherited命令了)。
消息处理句柄方法声明为:
procedureMymsgmethod(varmessage:Tmessage);messageMsgtype;
同样用户也可以定义自己的消息,用户自定义消息应从WM_USER开始.
自定义消息及消息处理句柄举例如下:
constmy_paint=Wm_user+1;
type
Tmypaint=record
msgid:cardinal;
msize:word;
mcolor:longint;
msgresult:longint;
end;
type
Tmycontrol=class(TCustomControl)
protected
procedurechange(varmessage:Tmypaint);messagemy_paint;
.....
end;
......
procedureTmycontrol.change(varmessage:Tmypaint);
begin
size:=message.msize;{设置Tmybutton尺寸属性}
color:=message.mcolor;{设置Tmybutton颜色属性}
{dosomethingelse}
inherited;{交由Tcustomcontrol处理}
end;
三.过滤消息
过滤消息又称消息陷阱。在一定情况下,用户可能需要屏蔽某些消息.或者截获某些消息进行处理。由以上介绍可以看出过滤消息一般有三种途径:(1).重载构件继承的虚拟方法wndproc.(2).针对某
消息编写消息处理句柄.(3).重载构件继承的虚拟方法Defhandler,在其中对消息进行处理。其中常用的方法是方法(2),在上节中已介绍过了,方法(1)与方法(3)相似,这里只简单介绍一下方法(1)。
重载虚拟方法wndproc的一般过程如下:
procedureTmyobject.wndproc(varmessage:Tmessage);
begin
{...判断此消息是否该处理..}
inheritedwndproc(message);
{未处理的消息交由父辈wndproc方法处理}
end;
由此可以看出在wndproc方法中处理消息的优势是可以过滤整个范围内的消息,而不必为每个消息指定一个处理句柄,事实上Tcontrol构件中就是利用它来过滤并处理所有的鼠标消息的(
从WM_mousefirst到WM_mouselast,如下代码示).同样利用它也可以阻止某些消息被发送给处理句柄。
procedureTControl.WndProc(varMessage:TMessage);
begin
if(Message.Msg>=WM_MOUSEFIRST)and
(Message.Msg<=WM_MOUSELAST)
then
ifDraggingthen{处理拖曳事件}
DragMouseMsg(TWMMouse(Message))
else
...{处理其他鼠标消息}
end;
Dispatch(Message);
{否则正常发送消息}
end;
下例为一简单的自定义构件例子:
Tmyedit类是从Tedit类派生出的一个新类,它的特点是在运行中不能获得焦点,不能由键盘输入(有点类似Tlabel构件).我们可在其wndproc方法中过滤出WM_setfocus,WM_mousemove消息并进行处理来达到上述
要求,源程序如下:
unitmyedit;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,
Controls,Forms,Dialogs,
StdCtrls;
type
Tmyedit=class(TEdit)
private
{Privatedeclarations}
protected
{Protecteddeclarations}
{otherfieldsandmethods}
procedurewndproc(varmessage:Tmessage);override;
public
{Publicdeclarations}
published
{Publisheddeclarations}
end;
procedureRegister;
implementation
procedureRegister;
begin
RegisterComponents('Samples',[Tmyedit]);
end;
procedureTmyedit.wndproc(varmessage:tmessage);
begin
ifmessage.msg=wm_mousemovethen
begin
cursor:=crarrow;
{设置光标为crarrow,而不是缺省的crBeam光标}
exit;
end;
ifmessage.msg=wm_SetFocusthenexit;
{屏蔽掉WM_setfocus消息,不让Tmyedit控件获得输入焦点}
inheritedwndproc(message);
{其他消息交父辈wndproc处理}
end;
end.
您可以将Tmyedit加到ComponentPalette中检验其性能。
由以上介绍可以看出,只有清楚了DelphiVCL中的消息处理机
制,掌握好处理各种消息的方法和时机(必要时要借助各种工
具,如winsight32,spy等),并结合OOP语言的特点,我们才可能编
出高质量的构件。这当然要靠读者在实践中不断摸索,积累经
验
internetcsdn
2003-09-20
打赏
举报
回复
我也记下先
bluenightsky
2003-09-20
打赏
举报
回复
好东西哦,大家来抢:)
雨后阳光2000
2003-09-20
打赏
举报
回复
谢谢共享…………………………………………………………………………………………………………
空中居士
2003-09-20
打赏
举报
回复
up
昆曲之源_娄江河畔
2003-09-20
打赏
举报
回复
谢谢
popmailzjw
2003-09-20
打赏
举报
回复
up
wkoji
2003-09-20
打赏
举报
回复
很好
seion
2003-09-20
打赏
举报
回复
我爱楼主
加载更多回复(30)
Window
消息
大全
使用
详解
[
Window
Message.rar]-精品源代码
Window
消息
大全
使用
详解
[
Window
Message.rar]-精品源代码
CMake小白入门课程(
Window
篇)
本课程是针对
Window
s平台,
使用
CMake来编译代码,运行程序。 比如创建动态库、静态库等基本项目,
使用
C++11, C++14等高级特性。 CMake是跨平台开发必不可少的工具。 很多同学在移植代码的时候,发现需要把Linux上的...
Window
_
消息
大全
使用
详解
Window
消息
大全
使用
详解
message TMsg
Window
消息
大全
使用
詳解
Window
消息
大全
使用
詳解
Delphi
5,392
社区成员
262,732
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章