有没有办法阻止用户调整表单的大小?
目前我正在使用:
当表单大小改变时....
MainForm.Height := 761;
MainForm.Width := 777;
但是这个看起来很糟糕,因为当用户尝试改变表单大小时,它会闪烁。
固定窗口大小很容易,有两种方法:
Delphi窗体有一个BorderStyle
属性和一个BorderIcons
属性。如果你将BorderStyle
设置为bsDialog
,并且将BorderIcons
设置为只有biSystemMenu
,则用户无法调整窗体大小。
你可以指定Constraints
属性的值。如果你将MinWidth
和MaxWidth
写成相同的数字,则宽度将被固定。
防止移动就有点棘手了。我现在只能想到以下几种解决方案:
将BorderStyle
设置为bsNone
。如果需要,你需要自己绘制窗体标题栏。
写一个消息处理程序来处理WM_NCHITTEST
消息,首先调用继承的处理程序,然后检查Message.Result
是否为HTCAPTION
。如果是HTCAPTION
,则将其设置为HTCLIENT
。这样,你欺骗Windows认为用户没有点击标题栏,因此他将无法拖动。请尝试是否仍然可以通过打开系统菜单并选择移动来移动窗口,如果是,则还需要隐藏系统菜单(BorderIcons
)。
答案来源于这里。
如果您希望表单根本不会自动调整大小,那么将表单边框样式设置为bsSingle
是正确的做法,因为当鼠标移动到表单边框上时,鼠标指针不会变成其中一个调整大小的指针,这样用户就可以明确地知道该表单无法调整大小。
如果您想为表单设置最小和/或最大尺寸,则bsSizeable
是正确的边框样式,并且您可以使用表单的Constraints
来指定限制。然而存在问题,即Constraints
属性不能防止表单的调整大小,它只会在事后调整大小,以便不违反限制。这将导致负面影响,即使用左边框或上边框调整大小会移动表单。要防止出现这种情况,您需要在第一时间防止调整大小。Windows发送WM_GETMINMAXINFO
消息以检索顶层窗口的最小和最大跟踪尺寸。处理并返回正确的约束条件可以解决移动表单的问题:
type
TForm1 = class(TForm)
private
procedure WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
message WM_GETMINMAXINFO;
end;
// ...
procedure TForm1.WMGetMinMaxInfo(var AMsg: TWMGetMinMaxInfo);
begin
inherited;
with AMsg.MinMaxInfo^ do begin
ptMinTrackSize := Point(Constraints.MinWidth, Constraints.MinHeight);
ptMaxTrackSize := Point(Constraints.MaxWidth, Constraints.MaxHeight);
end;
end;
Resize := False;
例子:
procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;
wm_Size
,@Robsoft,但它是一种通知而不是命令。一旦您收到了该消息,就太晚了,因为窗口的大小已经改变了。 - Rob Kennedy