【问题标题】:Disable form resizing in delphi在delphi中禁用表格调整大小
【发布时间】:2011-02-02 01:41:25
【问题描述】:

有什么方法可以阻止用户调整表单大小?

目前我正在使用:

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

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

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

【问题讨论】:

  • 您不能捕获 WM_RESIZE 事件并吞下它吗?我敢打赌,在我今晚回家之前,其他人会发布一些代码,但如果没有,我稍后会发布一些东西。我 99% 确定我以前在某个地方做过这个。 :-)
  • 你说的事件是wm_Size,@Robsoft,但它是一个通知,而不是一个命令。收到该消息后,为时已晚,因为窗口的大小已经改变。

标签: delphi forms resize


【解决方案1】:

固定大小很容易,您有两种选择:

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

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

防止移动比较棘手。我现在只能想出这些解决方案:

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

  2. 将消息处理程序写入WM_NCHITTEST,首先调用继承,然后检查Message.Result 中的HTCAPTION。如果是HTCAPTION,则改为HTCLIENT。这样一来,您就可以欺骗 Windows 以为用户没有点击标题,因此他将无法拖动。请尝试用户是否仍然可以移动打开系统菜单并选择移动的窗口。如果是这样,您也必须隐藏系统菜单(BorderIcons)。

找到答案here

【讨论】:

  • +1 我认为最简单的方法是使用约束。
  • 约束有一个非常烦人的错误:如果你将 MinWidthMaxWidthMinHeightMaxHeight 分别设置为相同的值,并尝试使用左侧或顶部边框,则窗体不会调整大小而是移动。设置bsSingle 没有这个问题,并且从UI 角度来看也更好(一致)。不可调整大小的表单也不应该有调整大小的边框。
  • @mghie。 > ...“然后表单不会调整大小而是移动”...这是一个 VCL 错误,似乎已修复。有关可能的解决方法,请参阅 QC71595 - qc.embarcadero.com/wc/qcmain.aspx?d=71595
  • @Sertac:是的,这是一个自引入约束以来一直存在的 VCL 错误,并且十多年来一直没有修复。我对这个问题的回答是我一直在使用的另一种解决方法(无需更改 VCL)。虽然这很棒,但他们似乎终于修好了。
【解决方案2】:

如果您希望您的表单根本不调整大小,那么将表单边框样式设置为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;

【讨论】:

  • 谢谢,你的解决方案救了我
【解决方案3】:

您可以在“OnCanResize”事件中添加代码:

Resize := False;

例子:

procedure TF_NameForm.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  Resize := False;
end;

【讨论】:

  • 但是,您应该首先设置它的最小值和最大值,否则这会将表单调整为默认的表单大小,即正方形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2014-11-16
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多