王朝网络
分享
 
 
 

如何捕获VCL没有处理的Windows消息

王朝vc·作者佚名  2008-06-01
宽屏版  字体: |||超大  

---- C++ Builer的VCL提供了对大多数Windows消息的处理机制,这对于一般应用程序是足够了,但VCL也不是无所不包的,对于那些VCL没有处理的Windows消息,在需要时如何进行捕捉呢?C++ Builder采用了消息映像表机制,通过消息映像表将特定的Windows消息与代码中的函数联系起来,当窗口捕捉到消息时就会调用这个函数,这其实和事件句柄非常相似。

---- C++ Builder消息映像表定义形式如下:

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(< message >,

< message strUCture >,< message handler >)

……

MESSAGE_HANDLER(< message >,

< message structure >,< message handler >)

END_MESSAGE_MAP(ClassName)

---- ClassName是基础类名,message参数是要捕捉的Windows消息,message structure参数用于传递VCL剖析消息后用于传递参数的消息剖析结构名,里面包含处理消息时所需要的全部参数,不同的消息其消息剖析结构是不同的,一般性的消息剖析结构定义如下:

struct Tmessage

{

unsigned int Msg;//Windows消息

long Wparam;

long Lparam;

long Result;

}

---- 这里要害是Result数据成员,它用于设置处理消息后的返回值,程序可以根据不同的返回值进行相应的处理。message handler参数是对消息进行处理的函数名称。

---- 俗话说:千言不如一图。下面就用一个例子具体说明一下,让我们来拖动一个无标题的窗口,实现的原理是通过捕捉WM_NCHITTEST消息,在鼠标单击窗体的客户区时发送消息,让Windows认为是个窗体的标题栏上。

---- 创建一个新工程,将单元文件保存为mainform.cpp,工程文件保存为nocaption.bpr。首先得创建一个无标题栏的窗体,将Form1的BorderIcons集合设为空,这就删除了窗口的系统菜单、最大化和最小化按钮,将BorderStyle属性设为bsDialog。注重在设计时创建的所有C++ Builder窗体都会有一个标题栏,你并不能象VB中那样简单地通过将Form1的Caption属性设为空来得到一个无标题栏窗体,你必须在TForm的派生类中重载CreateParams函数,去除相应的窗口标识位,在运行时删去窗体的标题栏。打开mainform.h文件,在private段增加CreateParams的原型:

void __fastcall CreateParams(TCreateParams& Params);

TCreateParams结构包含了创建窗体的各种参数,

在这里我们要屏蔽掉WS_CAPTION位。

在mainform.cpp中增加如下代码:

void __fastcall TForm1::CreateParams(TCreateParams& Params)

{

TForm::CreateParams(Params);//先调用基础类中的成员函数

Params.Style &=~WS_CAPTION;

}

---- 下面创建消息映像表,对WM_NCHITTEST消息进行捕捉,在mainform.h的public段输入代码:

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER

(WM_NCHITTEST,Tmessage,WMNchitTest)

END_MESSAGE_MAP(TForm)

---- WM_NCHITTEST消息名称为"非客户区命中测试",它优先于所有其它的客户区和非客户区鼠标消息,Windows应用程序通常把这个消息传送给DefWindowProc,然后Windows用这个消息产生基于鼠标位置的所有其它鼠标消息。

---- 在private段加入消息处理函数的声明:

void __fastcall WMNchitTest(Tmessage &message);

---- 在mainform.cpp中输入此函数的定义:

void __fastcall TForm1::WMNchitTest(Tmessage &message)

{

if(GetAsyncKeyState(VK_LBUTTON)< 0)

---- message.Result=HTCAPTION; //假如鼠标左键按下,就通知Windows鼠标所在区域是标题栏区,Windows就会按要求完成拖动操作。

else

message.Result=HTCLIENT;

}

---- 这里用Windows API函数GetAsyncKeyState来实时检查鼠标按钮的状态,通过检测虚拟键码VK_LBUTTON的高位是否被置位来探测鼠标动作,假如按下鼠标左键,此键码的高位被置1,此时GetAsyncKeyState函数将返回一个负数。

---- 按F9编译并运行程序,单击窗体任一位置就可以象单击在标题栏上一样拖动窗体了,这里没有给出结束程序运行的机制,可以通过增加PopMenu来实现。

---- 以上代码在C++ Builder3、Pwin98环境下编译、运行通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有