大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 关于捕获VCL没有处理的Windows消息

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

时间: 2021-07-31 作者:daque

对于c++ builder的步调员来说,vcl以其精巧、高效的特性令人爱好。由于vcl是在windows api的普通长进行了封装,同声唾弃了少许不常用的功效,以是,vcl在功效上是windows api 的子集。vcl供给了对大普遍windows动静的处置体制,然而对于没有处置的windows动静呢,在须要是怎样捕捉呢?c++ builder沿用了动静映照标体制,经过动静映照表将一定的windows动静于代码中的因变量接洽起来,当窗口捕捉到动静时就会挪用这个因变量。c++ builder动静映照表设置情势如次:begin_message_mapmessage_handler(<message> , <message structure> , <message handler>)end_message_map(classname)个中:begin_message_map:动静映照设置开始语句message_handler:动静处置设置end_message_map:动静映照设置中断语句classname:是要接收动静的类名message:是要截获的windows动静message handler:动静处置因变量称呼message structure:是用来传播给vcl动静的构造称呼,此构造里包括有处置动静时所需的十足参数,各别的动静所对应的动静构造是各别的。因为每一个vcl控件(不管是窗体仍旧按钮)都不妨独力的接受windows动静,而且举行独力的相应,以是确定要提防动静定一种的classname参数。此刻举例证明动静设置、传播的运用。此刻一个窗体formmain,和2个tperformancegraph控件(不许相应鼠标事变),此刻我要对2个tperformancegraph控件设置鼠标单击事变,对formmain也重设置鼠标单击事变,进程如次(假设工程文献为message.bpr,步调文献为main.cpp、main.h):源代码如次://----main.h--------------------------------------------------------------#ifndef mainh#define mainh//---------------------------------------------------------- #include <classes.hpp>#include <controls.hpp>#include <stdctrls.hpp>#include <forms.hpp>#include "perfgrap.h"//-----------------------------------------------------------class tformmain : public tform{__published: // ide-managed components//----2个规范tperformancegraph控件tperformancegraph *performancegraph1;tperformancegraph *performancegraph2;tedit *edit2;tedit *edit1;void __fastcall formcreate(tobject *sender);private: // user declarations//----自设置的动静处置因变量,个中message不妨不写message void __fastcall lbuttondown(tmessage &message);//----用户设置的因变量(处置动静,简直运用见.cpp文献)void __fastcall mywndproc1(tmessage &message);void __fastcall mywndproc2(tmessage &message);//----因变量南针,用来生存2个tperformancegraph控件的动静处置因变量的南针twndmethod oldwndproc1 , oldwndproc2;public: // user declarations__fastcall tformmain(tcomponent* owner);//----窗体的动静设置begin_message_mapmessage_handler(wm_lbuttondown , tmessage , lbuttondown)end_message_map(tform)};//---------------------------------------------------------------------------extern package tformmain *formmain;//---------------------------------------------------------------------------#endif//----main.cpp------------------------------------------------------------#include <vcl.h>#pragma hdrstop#include "main.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma link "perfgrap"#pragma resource "*.dfm"tformmain *formmain;//---------------------------------------------------------------------------__fastcall tformmain::tformmain(tcomponent* owner): tform(owner){}//---------------------------------------------------------------------------void __fastcall tformmain::lbuttondown(tmessage &message){//----即使鼠标在窗体内(控件外)被单击,则此事变被激活if(getasynckeystate(vk_lbutton) < 0){application->messageboxa("form get messsge" , "message" , mb_ok);//----向edit2发送鼠标动静,则edit2将爆发单击赢得中心的局面sendmessage(formmain->edit2->handle ,message.msg ,message.wparam ,message.lparam);}}//---------------------------------------------------------------------------void __fastcall tformmain::formcreate(tobject *sender){//----替代2个tperformancegraph控件的动静处置因变量句柄oldwndproc1 = performancegraph1->windowproc;oldwndproc2 = performancegraph2->windowproc;performancegraph1->windowproc = mywndproc1;performancegraph2->windowproc = mywndproc2;}//---------------------------------------------------------------------------void __fastcall tformmain::mywndproc1(tmessage &message){if (message.msg == wm_lbuttondown)//----即使动静是“鼠标单击动静”,则表露消息showmessage("performancegraph1 get message ");else //----即使动静是其余动静,则交给控件从来的处置oldwndproc1(message);}//---------------------------------------------------------------------------void __fastcall tformmain::mywndproc2(tmessage &message){if (message.msg == wm_lbuttondown) showmessage("performancegraph 2 get message");else oldwndproc2(message);}即使在tformmain::formcreate()因变量中介入以次两句语句:oldwndproc3 = formmain->windowproc;formmain->windowproc = mywndproc3;再增添因变量:void __fastcall tformmain::mywndproc3(tmessage &message){if (message.msg == wm_lbuttondown)//----即使动静是“鼠标单击动静”,则表露消息showmessage(“formmain get the message ");else //----即使动静是其余动静,则交给控件从来的处置oldwndproc1(message);}则把formmain的鼠标动静相应因变量举行了改装,此时窗体就会截获鼠标动静,而2个tperformancegraph控件将不会获得动静。这是由于窗体将先于控件获得动静。从上头的例子不妨看出:1、 窗体将先于控件获得动静;2、 对于相应某一动静的控件,不妨用sendmessage想起发送动静;3、 对于不相应某一动静的控件,不妨用重载其windowproc属性赢得你想要的功效。本质上,控制了运用windows的动静传播体制才是控制c++ builder的第二阶段,任重而道远。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.