快速业务通道

BCB控件制作和消息处理

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

1 前言

作为和delphi类似的rad(rapid application development)工具,c++ builder的强大功能不仅体现在数据库开发方面,也凸现于应用程序开发上(令人称绝的是这两方面结合得非常好)。仅就应用程序而言,要真正体现c++ builder的优势,开发出高质量的软件,则在拖拉拽放之外,尚需用到一些进阶技术。如消息处理、dll、ole、线程、sdk编程。c++ builder在这些方面都或多或少有独到的优势。此外,可以方便地制作自定义控件,也是c++ builder的一大特色和高级功能。本文将通过制作一个标题棒在窗口左边的对话框控件,来示范一些c++ builder中关于控件制作和消息处理的概念,同时涉及到一点sdk编程。我们将要制作的是一个对话框,就如同opendialog等一样,一调用其execute()方法,就弹出一个如图一所示的窗口。这个窗口的标题棒位于左方,绿色,文字走向为由下而上的90度字形,其功能和一般的标题棒相同,可以將鼠标移至该处来移动该窗口。

首先来完成这个窗口,然后用它来制作对话框控件。

2 利用wm_nchittest消息制作竖直标题的窗口

.wm_nchittest消息

c++builder将某些windows消息封装于事件(event)中,但无法囊括所有消息,如wm_nc**** 系列消息。wm_nchittest消息发生于游标(cursor)移动或鼠标按下、释放时,返回值指示目前游标所在位置,如返回hthscroll表示处于水平滚动条内,返回htcaption表示处于标题棒内(参见win32 sdk help)。其参数xpos、ypos分别表示游标的x、y坐标(相对于屏幕左上角),分别对应于lparam的低字和高字。如果拦截wm_nchittest消息,使得当鼠标在窗口左边按下时,人为地将返回值设为htcaption,则系统将以为是在标题棒内,于是将可以移动窗口,完成了标题棒的功能,至于颜色和文字,则与消息无关,将在下面叙述其原理。

.windows消息

消息就是windows操作系统送往程序的事件。但事件数以百计,操作系统并沒有为各个事件设计不同的消息结构,而是以一个一般性的结构来来描述消息,这个结构在c++ builder中定义为tmessage。另外c++ builder对常见消息定义了专用结构,二者对等。可以直接将消息转换为专用结构,也可以自行解释tmessage参数。以wm_nchittest消息为例,它的定义如下:

struct twmnchittest
{
cardinal msg;
long unused;
union
{
struct
{
windows::tsmallpoint pos;
long result;
};
struct
{
short xpos;
short ypos;
};
};
};
对照tmessage定义:
struct tmessage
{
cardinal msg;
union
{
struct
{
word wparamlo;
word wparamhi;
word lparamlo;
word lparamhi;
word resultlo;
word resulthi;
};
struct
{
long wparam;
long lparam;
long result;
};
};
};

可以发现,tmessage的lparam成员对应twmnchittest的pos成员,就是说以下两行语句

等价:

tpoint pt=tpoint(msg.lparam); //此时msg类型为tmessage

tpoint pt=tpoint(msg.pos); //此时msg类型为twmnchittest

.c++ builder处理消息的宏

在c++ builder中自定义消息处理是较为方便的,结合wm_nchittest举例如下:

在窗口类的protected部分加入如下宏定义:

begin_message_map

message_handler(wm_nchittest,tmessage,onnchittest)

end_message_map(tform)

message_handler包含3个参数:wm_nchittest,消息标识,也可以为自定义消息如wm_mymessage,这时只需加一个宏如#define wm_mymessage wm_app+1等;第二个参数tmessage代表消息类型,也可以为符合要求的自定义消息结构类型如tmymsg等,onnchittest为消息处理函数。这样,一旦有wm_nchittest消息传给tform,对该消息的响应就完全交由onnchittest函数处理。onnchittest函数只有一个参数,类型为message_handler中第2个参数的引用,即tmessage &或tmymsg &。

.完成图一的窗口。

开始一个新应用程序(new application),将

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号