>BCB实现MDI程序背景图 </P>
>(中国计算机报-金君飞 2001年11月08日 10:34) </P>1 p) B& x/ w2 N8 j. X0 K
>在开发软件时,总希望软件界面越漂亮越好,我们在C++ Builder的SDI程序中比较容易 </P>
>实现漂亮的软件界面,但在MDI程序中,由于Windows的MDI软件的开发隐藏了许多技术细 </P>
>节,用SDI程序的方法,就不能实现了。下面笔者将详细讲述如何实现MDI程序背景图。 </P>4 C6 p/ q2 T, U0 |' x/ {2 a
> </P>8 h7 v) y( Y$ }% ^
>在MDI程序中是由两个窗口构成的,一个MDI主窗口和一个客户窗口。客户窗口覆盖了主 </P>
>窗口的客户区,并提供大量的MDI支持。在C++ Builder的MDI 的主窗口中提供了一个Cl </P>
>ientHandle的客户窗口句柄,我们就是利用这个句柄来实现位图的显示。我们知道,在 </P>* x- s) W3 E) H, N
>Windows的窗口中绘置位图,为使位图能够不断地刷新,必须响应WM_PAINT和WM_ERASEB </P>
>KGND消息。我们可以利用钩子函数(钩子是Windows系统中一种特殊的消息处理机制,可 </P>3 W7 f) {( t& ^' K
>以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理)。截住Wi </P>- ` i! a t3 y! Z" L" j9 ?
>ndows系统发送给MDI客户窗口的WM_PAINT和WM_ERASEBKGND消息,从而实现客户窗口的刷 </P>
>新和重绘。我们可以在系统中安装自定义的消息钩子,对发往客户窗口的消息进行过滤 </P>
>,只处理WM_PAINT和WM_ERASEBKGND,以实现我们的目标。 </P>& u* Q# D$ s" ?$ s, }
>编写钩子函数 </P>: ~( {9 u2 k5 k0 ~
>编写Windows钩子函数分为三步:定义钩子、安装钩子和 对 钩子。 </P>
>定义钩子函数 </P>
>钩子函数是一种特殊的回调函数,不同事件的钩子其函数头是不一样,本次用到的钩子 </P>
>函数如下所示: </P>" J8 g4 R* {$ _- w H
>LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) </P>$ P* E4 T& g% U5 @ x+ p5 ]
>参数nCode的值表示本钩子函数是否必须处理该消息, wParam表明这次传递的消息是否 </P>
>已从Windows消息队列中删除, lParam参数用来传送消息。 </P>' h* m! p/ V: S D$ v% t1 L
>在钩子函数中,必须将系统发送的消息继续回送给系统以使其它程序可以继续使用该消 </P>& t( x9 C( x; K$ N
>息,该函数为: </P>
>LRESULT CallNextHookEx(HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) </P>3 N6 G. w& c- B: a$ p8 M
>参数hhk是安装钩子函数时安装函数返回的句柄,nCode、wParm和lParm参数是系统传给 </P>+ N4 j( x! W' t% t
>钩子函数的值。 </P>! ~8 ~4 @7 Z* _: }( y0 i4 B. e
>安装钩子函数 </P>
>定义完钩子函数后,必须将该钩子安装到Windows系统中才能生效,安装钩子的函数为: </P>| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |