【问题标题】:Reading the real form dimensions when minimized from maximized state从最大化状态最小化时读取实际表单尺寸
【发布时间】:2022-01-05 00:18:38
【问题描述】:

不知道你有没有注意到,但是如果你最大化一个TForm 然后最小化它,如果你读取它的宽度和高度(在这个最小化状态下),你会得到表单在最大化之前的值...在我看来,这是错误的。

当我的表单最小化时,有时它需要根据表单的ClientWidthClientHeight 重新排列控件。因此,如果最后一个 Form 尺寸以及它从最小化返回的尺寸是最大化状态下的尺寸,如果我得到规范化 Form 的 Width 和 Height,我的控件将被错误地排列。

你知道当窗体从最大化状态最小化时,我如何读取真正的ClientWidthClientHeight 吗?

【问题讨论】:

  • 如果您需要查询最小化表单的视觉属性,您的设计可能存在缺陷。
  • 看看GetWindowPlacement(),它报告了窗口从最小化/最大化状态移动到恢复状态时的正常位置和大小。
  • @RemyLebeau 我分析了那个函数,它似乎没有返回最大化的窗口大小。它仅返回 rcNormalPosition 的宽度和高度。
  • 如果您觉得需要重新排列控件,当表单的大小发生变化时,您就有了设计问题。在构建(动态)GUI 时,面板是您的朋友。

标签: forms delphi minimize delphi-10.3-rio


【解决方案1】:

我用这个解决方法解决了这个问题:在窗口尺寸发生变化时存储窗口尺寸,在窗口尺寸最小化时跳过。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    RealClientW, RealClientH: Integer;
    procedure WMWindowPosChanged(var Msg: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMainForm.WMWindowPosChanged(var Msg: TWMWindowPosChanged);
begin
 inherited;
 if not IsIconic(Handle) then begin
  RealClientW:= ClientWidth;
  RealClientH:= ClientHeight;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 caption:= IntToStr(RealClientW) + ' x ' + IntToStr(RealClientH);
end;

end.

【讨论】:

  • 如何捕捉之前最大化的应用程序最小化时屏幕尺寸发生变化的情况?
  • @UweRaabe 确实......我必须考虑一下...... :(
  • ...或者屏幕被附加/分离,所以桌面大小改变了?
  • 我认为答案是这样的:stackoverflow.com/questions/14772588/…。但问题是我需要ClientWith,而不是简单的窗口宽度......
  • 是什么让你远离using GetClientRect()
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2012-07-08
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多