HGE使用过程中,窗口大小是固定的,不能像Windows资源管理器那样,可以任意大小的伸缩。在网络上搜索了一圈之后,也没有发现有什么解决办法,但是找到了一般windows窗口伸缩的解决方案。那么只能自己动手修改HGE源码实现了。由于时间过长,源贴地址我已经找不到了,下面是我自己整理的。
打开hge的源码,找到System.cpp,最后一个函数是HGE窗口的消息处理函数WindowProc,里面对一些基本的鼠标键盘响应做了处理,下面我们要自己添加消息响应,使窗口自由能够伸缩。
我们要处理的消息一共有四个WM_SETCURSOR、WM_NCHITTEST、WM_NCLBUTTONDOWN、WM_ERASEBKGND。
(1)WM_SETCURSOR
这个消息,是用来更改鼠标指针的,比如在鼠标移到窗口的边缘指针变为<->这种形状,提示可以伸缩。消息参数我们用到lParam里低位的nHitTest,这是个鼠标点击测试代码(Mouse Hit-Test Codes)。
这个消息的处理,我们只需要判断nHitTest的值是边缘的情况下鼠标更换为响应方向的双箭头指针,其他情况下更换为箭头指针即可。关于nHitTest的取值,百度或者MSDN。
最后需要返回TRUE以防止系统的默认处理。
return TRUE;
(2)WM_NCHITTEST
这个消息是用来告诉窗口,鼠标存在于窗口的什么部分,在这个消息里,我们需要判断窗口的边缘,并返回响应的值即可。
(3)WM_NCLBUTTONDOWN
在这个消息里,需要通知窗口即将开始伸缩。我们要做的就是,从wParam中获取nHitTest并根据它的值判断当前鼠标正处于哪个边界,然后根据鼠标确定消息参数,并发送WM_SYSCOMMAND消息。
(4)WM_ERASEBKGND
实际上,上面几个消息已经能够完成窗口缩放了,但是会出现界面闪烁的情况,所以我们需要处理WM_ERASEBKGND消息,防止Windows自己重绘(对这个消息原理不太明白的童鞋请百度)。
直接return TRUE即可。
编译hge.dll,替换原有的dll之后,HGE窗口可以自身支持动态缩放了。
本想本篇写点自己的心得体会,可是写完之后,发现大多数都是别人的东西,只有最有一个WM_ERASEBKGND是我在实际使用过程中解决的,唉,写技术文章不容易啊。。