有没有办法阻止用户调整表单大小?
目前我正在使用:
当表单大小改变时....
MainForm.Height := 761;
MainForm.Width := 777;
但这看起来很可怕,因为当用户试图改变表单大小时它会闪烁。
答案 0 :(得分:39)
修改尺寸很简单,您有两种选择:
Delphi表单具有BorderStyle
属性和BorderIcons
属性。如果您将BorderStyle
设置为bsDialog
,将BorderIcons
设置为biSystemMenu
,则用户无法调整表单大小。
您可以为Constraints
属性指定值。如果您将相同的号码写入MinWidth
和MaxWidth
,则宽度将会固定。
防止移动更棘手。我现在只能提出这些解决方案:
将BorderStyle
设为bsNone
。如果需要,您需要自己绘制表单标题。
将消息处理程序写入WM_NCHITTEST
,先调用继承,然后检查Message.Result
HTCAPTION
。如果是HTCAPTION
,请将其设置为HTCLIENT
。这样,你愚弄Windows认为用户没有点击标题,所以他将无法拖动。请尝试用户是否仍然可以移动打开系统菜单的窗口,然后选择“移动”。如果是这样,您还必须隐藏系统菜单(BorderIcons
)。
回答here。
答案 1 :(得分:9)
如果您希望表单根本不调整大小,那么将表单边框样式设置为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;
答案 2 :(得分:1)
您可以在“OnCanResize”事件中添加代码:
Resize := False;
示例:
procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;