关于捕获VCL没有处理的Windows消息

关于捕获VCL没有处理的Windows消息,第1张

关于捕获VCL没有处理的Windows消息,第2张

对于C++ Builder的程序员来说,VCL因其灵活性和高效性而备受喜爱。因为VCL是在Windows API的基础上封装的,并且舍弃了一些不常用的功能,所以VCL在功能上是Windows API的子集。VCL为大多数Windows消息提供了处理机制,但是未处理的Windows消息呢?需要的时候怎么捕捉?C++ Builder采用消息映射机制,通过消息映射表将特定的Windows消息与代码中的一个函数链接起来,当窗口捕获到消息时就会调用这个函数。
c++ Builder消息映射表的定义形式如下:
begin _ message _ map
message _ handler(,,)
END_MESSAGE_MAP(class name)[/Br/]其中:[/Br/]BEGIN _ MESSAGE _ MAP:消息映射定义开始语句[/Br/]消息处理定义[/Br/]END _ MESSAGE _ MAP:消息映射定义结束语句[/ Br/] ClassName:是要接收的消息的类名[/Br/]MESSAGE这个结构包含处理消息所需的所有参数,不同的消息有不同的消息结构。
由于每个VCL控件(无论是窗体还是按钮)都可以独立接收Windows消息并独立响应,因此注意消息类型的ClassName参数非常重要。
现在举例说明消息定义和传递的应用。现在有了一个FormMain和两个TperformanceGraph控件(无法响应鼠标事件)。现在我想为两个TperformanceGraph控件定义鼠标单击事件,并为FormMain重新定义鼠标单击事件。流程如下(假设项目文件为Message.bpr,文件为main.cpp,main.h):
源代码如下:
// -。定义mainH
///-
# include
# include
# include
# include " performance graph . h "
///-
类t formmain:public t form
{
_ _ published://IDE管理的组件
/-2标准TperformanceGraph控件
TPerformance graph * performance graph 1;
TPerformanceGraph * performance graph 2;
TEdit * edit 2;
TEdit * edit 1;
void _ _ fast call form create(to object * Sender);
Private://User Declarations
/-用户自定义的消息处理函数,其中消息不需要
MESSAGE void _ _ fastcalllbuttondown(t MESSAGE & MESSAGE);
//-用户定义的函数(请参见。cpp文件了解详情)
void _ _ fastcall mywndproc 1(t message & message);
void _ _ fast call mywndproc 2(t message & message);
// -函数指针,用于存储两个TperformanceGraph控件的消息处理函数的指针
twndmethod old wndproc1,old wndproc2
public: // User声明
_ _ fast call TFormMain(t component * Owner);
// -表单的消息定义
begin _ message _ map
message _ handler(WM _ lbuttondown,tmessage,lbuttondown)
end _ message _ map(t form)

///-
extern PACKAGE tform main * form main;
///-
# endif

//-main . CPP-
# include
# pragma HDR stop
# include " main . h "
///-
# pragma package(smart _ init)
# pragma link " perf grap "
# pragma resource " *。DFM "
t form main * form main;
///-
_ _ fast call TFormMain::TFormMain(t component * Owner)
:t form(Owner)
{ }
///-
Void _ _ fastcalltform main::lbuttondown(t message & message)
{
//-如果在窗体内(控件外)单击鼠标,则激活此事件
If(getasynckeystate(vk _ lbutton
// -发送鼠标消息给Edit2,Edit2会点击获得焦点
Sendmessage(form main-> edit 2-> handle,
message.msg,
message.wparam,
message..
}
}
///-
Void _ _ fastcalltform main::form create(to object * sender)
{
/-替换两个TperformanceGraph控件的消息处理函数的句柄
old wnd proc 1 = performance graph 1-> window proc;
oldwndproc 2 = performance graph 2--> window proc;
performance graph 1--> window proc = mywndproc 1;
performance graph 2--> window proc = mywndproc 2;
}
///-
void _ _ fastcall TFormMain::mywndproc 1(t Message & Message)
{
if(Message . msg = = WM _ lbuttondown)
/-如果消息为“鼠标单击消息”,将显示消息
show message("性能图1 get Message ");
else
/ -如果该消息是另一个消息,则将其交给控件的原处理
old wnd proc 1(message);
}
///-
void _ _ fastcall TFormMain::mywndproc 2(t message & message)
{
if(message。msg = = WM _ LBUTTONDOWN)
show Message(" performance graph 2 get Message ");
else
oldwndproc 2(message);
}
如果在TFormMain::FormCreate()函数中添加以下两条语句:
old wnd proc 3 = form main-> window proc;
form main-> window proc = mywndproc 3;
添加函数:
void _ _ fastcalltform main::mywndproc 3(T message & message)
{
if(message . msg = = WM _ lbuttondown)
//-如果消息为“鼠标点击消息”,则显示消息
show message(" form main get the message ");
else
/ -如果该消息是另一个消息,则将其交给控件的原处理
old wnd proc 1(message);
}
form main的鼠标消息响应函数已被修改,这样表单将截获鼠标消息,但两个TperformanceGraph控件将不会获得消息。这是因为窗体将在控件之前获取消息。
从上面的例子可以看出:
1。窗体将在控件之前获取消息;
2。对于响应消息的控件,可以使用SendMessage记住发送消息;
3。对于不响应消息的控件,可以重载其WindowProc属性以获得所需的效果。
其实掌握Windows的消息机制是掌握C++ Builder的第二个阶段,任重而道远。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 关于捕获VCL没有处理的Windows消息

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情