在delphi中禁用表单大小调整

时间:2010-03-29 14:15:52

标签: delphi forms resize

有没有办法阻止用户调整表单大小?

目前我正在使用:

当表单大小改变时....

MainForm.Height := 761;
MainForm.Width := 777;

但这看起来很可怕,因为当用户试图改变表单大小时它会闪烁。

3 个答案:

答案 0 :(得分:39)

修改尺寸很简单,您有两种选择:

  1. Delphi表单具有BorderStyle属性和BorderIcons属性。如果您将BorderStyle设置为bsDialog,将BorderIcons设置为biSystemMenu,则用户无法调整表单大小。

  2. 您可以为Constraints属性指定值。如果您将相同的号码写入MinWidthMaxWidth,则宽度将会固定。

  3. 防止移动更棘手。我现在只能提出这些解决方案:

    1. BorderStyle设为bsNone。如果需要,您需要自己绘制表单标题。

    2. 将消息处理程序写入WM_NCHITTEST,先调用继承,然后检查Message.Result HTCAPTION。如果是HTCAPTION,请将其设置为HTCLIENT。这样,你愚弄Windows认为用户没有点击标题,所以他将无法拖动。请尝试用户是否仍然可以移动打开系统菜单的窗口,然后选择“移动”。如果是这样,您还必须隐藏系统菜单(BorderIcons)。

    3. 回答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;
相关问题