社区
Delphi
帖子详情
Window 消息大全使用详解
IORILI
2003-09-19 02:12:55
加精
消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,(我转贴的)
...全文
170
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
s发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使
Window
s发送一 个
消息
给应用程序。
消息
本身是作为一个记录传递给应用程序的,这个记录中包含了
消息
的类型以及其他信息。例如,对于单击鼠标所产生的
消息
来说,这个记录中 包含了单击鼠标时的坐标。这个记录类型叫做TMsg,(我转贴的)它在
Window
s单元中是这样声明的:typ
【嵌入式系统】基于XSPI的HyperRAM双片扩展技术:STM32N6外部存储器并行驱动方案设计
内容概要:本文介绍了STM32N6微控制器如何通过单个XSPI接口驱动两片相同的HyperRAM,以扩展外部内存容量。重点阐述了硬件连接方式、XSPIM与XSPI1的配置方法,以及软件初始化流程。通过启用XSPI_DCR1寄存器中的EXTENDMEM位,实现XSPI根据访问地址自动切换片选信号(NCS1/NCS2),从而在内存映射模式下将两片HyperRAM视为连续地址空间
使用
,简化了多存储器管理的复杂性。; 适合人群:嵌入式系统工程师、MCU应用开发人员,特别是熟悉STM32系列并有外部存储器扩展需求的1-3年经验开发者;;
使用
场景及目标:①在机器学习推理、图像/音频处理等大内存需求场景下扩展外部RAM;②优化引脚资源利用,避免
使用
多个XSPI接口;③掌握STM32N6的XSPI高级配置与内存映射机制; 阅读建议:建议结合STM32CubeMX工具进行配置,并参考ST官方示例工程(如STM32N6-GettingStarted-ImageClassification)进行实践验证,重点关注EXTENDMEM位的使能逻辑与地址空间规划。
html邮箱注册含验证码
打开链接下载源码: https://pan.quark.cn/s/ef04777683de 在超文本标记语言中达成邮箱注册是一项根本且关键的Web开发操作,它关联到用户数据校验、表单递交以及潜在的后台处理环节。本指南将系统性地阐释这一流程,涵盖如何借助正则表达式执行邮箱规范校验以及怎样构建注册验证机制。超文本标记语言是用于构建网页框架的标准语言。当设计邮箱注册界面时,必须运用`
`标记来界定一个表单结构,并借助`
`标记来设立用户数据输入区域,比如电子邮箱地址和验证码字段。譬如: ```html
电子邮箱:
安全码:
完成注册
``` 在上述编码实例中,`type="email"`属性促使浏览器对输入的电子邮箱格式实施初步校验。`required`属性保障用户必须填写这些字段方可递交表单。 随后,我们将探讨正则表达式。在客户端验证电子邮箱规范时,能够通过JavaScript结合正则表达式来深度确认输入的电子邮箱是否合规。例如: ```javascript function validateEmail(email) { var regex = /^[...
高校如何利用AI技术提升知识产权管理质量?.docx
高校如何利用AI技术提升知识产权管理质量?
【C语言基础】操作符
详解
二
内容概要:本文深入讲解了C语言中结构体的两种成员访问操作符——点(.)和箭头(->),重点剖析其底层原理、
使用
场景及常见错误。通过定义、口诀、可运行代码示例和嵌套结构体的多层访问分析,清晰地展示了何时
使用
.(用于结构体变量)和何时
使用
->(用于结构体指针),并指出->本质上是(*ptr).member的语法糖。文章还详细列举了优先级问题、空指针风险、嵌套访问技巧以及动态内存分配下的指针
使用
规范,帮助开发者从根本上掌握结构体访问机制。; 适合人群:具备C语言基础,正在学习数据结构或指针操作的初学者,以及在实际开发中常混淆.与->
使用
的初级程序员;
使用
场景及目标:①理解结构体成员访问符的底层机制与优先级规则;②正确处理结构体嵌套和指针嵌套场景下的成员访问;③避免因误用.或->导致的编译错误与运行时崩溃; 阅读建议:结合文中提供的完整示例代码进行实践调试,特别关注嵌套结构体和指针访问的层级判断逻辑,强化“每级独立判断是否为指针”的思维习惯,提升代码健壮性。
Delphi
5,943
社区成员
262,941
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章