forms - 如何检测 Form Resize END,可能是通过使用 TApplicationEvents 组件?

标签 forms delphi window-resize delphi-10.4-sydney

在 Delphi 10.4 VCL 应用程序中,我需要检测 FORM RESIZING ENDS 的时间。 (例如,在用户通过拖动其大小 handle 调整表单大小后)。

所以我在表单上放置了一个 TApplicationEvents 组件并创建了它的 OnMessage 事件处理程序,试图捕获 WM_EXITSIZEMOVE 消息:

procedure TformMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  if (Msg.Message = WM_EXITSIZEMOVE) then
  begin
    CodeSite.Send('TformMain.ApplicationEvents1Message: WM_EXITSIZEMOVE');
  end;
end;

但是带有 WM_EXITSIZEMOVE 的事件处理程序在调整窗体大小后不会执行。

那么我如何才能检测到 Form Resize END,也许是通过使用 TApplicationEvents 组件?

最佳答案

WM_EXITSIZEMOVE消息被发送直接到窗口。因此,它不会被 TApplicationEventsOnMessage 检测到。处理程序,因为它只检测发布到主消息队列的消息。

因此,您需要改写表单的 WndProc():

type
  TForm1 = class(TForm)
  private
  protected
    procedure WndProc(var Message: TMessage); override;
  public
  end;

implementation

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_EXITSIZEMOVE:
      ShowMessage('Yes!');
  end;
end;

或者,您可以使用 message procedure相反:

type
  TForm1 = class(TForm)
  private
  protected
    procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
  public
  end;

implementation

procedure TForm1.WMExitSizeMove(var Message: TMessage);
begin
  inherited;
  ShowMessage('Yes!');
end;

但是,请注意,顾名思义,此消息不仅会在调整窗口大小时发送,还会在移动窗口后发送。并且在这两种情况下,仅当操作涉及模态循环时。

例如,如果您通过双击其标题栏来最大化窗口,或者如果您通过按 Shift+Win+,这条消息根本没有发送。

关于forms - 如何检测 Form Resize END,可能是通过使用 TApplicationEvents 组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63476818/

相关文章:

delphi - Firebird 和 Delphi 2009 出现错误消息 "Incorrect values within SQLDA structure"

javascript - jQuery 调整大小事件未触发

javascript - 在 Javascript 中 'this' 没有按预期工作

jquery - 使用 Am 图表隐藏/显示和调整问题大小

c# - 如何将数组中的 jpeg 转换为位图

php - 我无法在 Codeigniter 中循环显示 div id

javascript - 是否可以将事件传递给 Ajax 表单的 OnBegin 函数?

html - CSS - Chrome 中的占位符填充

delphi - VCLZip:zip 文件中的 "Virtual"目录

multithreading - 将数据从线程发送到主 VCL 线程