在delphi中禁用表单大小调整

che*_*sen 19 forms delphi resize

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

目前我正在使用:

当表格大小改变....

MainForm.Height := 761;
MainForm.Width := 777;
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*sik 39

修复大小很简单,您有两种选择:

  1. 德尔福表格BorderStyle有财产和BorderIcons财产.如果设置BorderStylebsDialog,并BorderIconsbiSystemMenu唯一的,用户不能调整的形式.

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

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

  1. 设置BorderStylebsNone.如果需要,您需要自己绘制表单标题.

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

答案在这里找到.

  • 但是,约束有一个非常烦人的错误:如果你将'MinWidth`和`MaxWidth`和`MinHeight`和`MaxHeight`分别设置为相同的值,并尝试使用左边框或上边框调整窗体的大小,那么表单将不会调整大小但移动.设置`bsSingle`没有这个问题,并且从UI的角度来看也更好(一致).不可调整大小的表单也不应具有调整大小边框. (5认同)
  • +1 我认为最简单的方法是使用约束。 (2认同)
  • @mghie.> ..."然后表格将不会调整大小但移动"......这是一个似乎已修复的VCL错误.有关可能的解决方法,请参阅QC71595 - http://qc.embarcadero.com/wc/qcmain.aspx?d=71595. (2认同)

mgh*_*hie 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;
Run Code Online (Sandbox Code Playgroud)