最近碰到一个问题,要通过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;
posted on 2009-07-12 01:52  jq50n  阅读(1062)  评论(0)    收藏  举报