最近碰到一个问题,要通过form的一个属性来对Form是否可以Resize进行设定(不可修改BorderStyle)
最初找到的是万一老师的这篇文章http://www.cnblogs.com/del/archive/2009/05/21/1486371.html
里面提供了三种方法
1.通过CreateParams方法实现
2.通过 FormResize事件中写死Form大小
3.使用OnCanResize方法实现(ReSize := False)
从中 获益匪浅。
但是这三种方法都不是我想要的
1.CreateParams,这个方法是在FormCreate之前,所以想要用Form的属性来设置的话,不大可能
除此之外,Params.Style这个感觉变化太大,不知道什么时候它有哪些元素
万老师提供的那种方法,BorderIcons没有sysmenu的时候行不通,感觉Form显示方法Show和ShowModal又有区别
即使同样是Show或ShowModal,第一次和第二次又有区别
举个例子
两个小画面A和B,二者都继承自一个CommonForm,程序启动时先启动A,A上按钮click之后,显示B
在CommonForm中的CreateParams方法中打断点发现,A启动时,这个方法运行了2次,B启动时却只运行了一次,
且以后都只CreateParams一次(为什么第一次启动会跑两遍CreateParams?)
相比1而言方法2就傻多了,死角会出现箭头,容易让人产生误解
方法3是个很不错的方法,但是我觉得有个缺陷,就是Form不能正常的最大化最小化了。要有办法在Form最大化或最小化之前将Resize设成True就好了
所以,上面的三种方法虽各有千秋,但是都不是我想要的,最终找到的解决方法是
响应WM_NCHITTEST消息,当鼠标移到上下左右四个边界,和左上,右上,左下,右下四个角时,返回HTCLIENT,这样就不会出现移动箭头,自然就不可移动了
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
begin
inherited;
if (Message.Result = HTLEFT) or (Message.Result = HTRIGHT) or (Message.Result = HTTOP)
or (Message.Result = HTBOTTOM) or (Message.Result = HTTOPLEFT)
or (Message.Result = HTTOPRIGHT) or (Message.Result = HTBOTTOMLEFT)
(Message.Result = HTBOTTOMRIGHT)
begin
Message.Result := HTCLIENT;
end;
end;
浙公网安备 33010602011771号