C++辅导:BCB控件制作和消息处理
来源:优易学  2011-11-16 12:22:05   【优易学:中国教育考试门户网】   资料下载   IT书店

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 &。 
.完成图一的窗口。

[1] [2] [3] 下一页

责任编辑:虫虫

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训