2

在 Delphi 10.4 VCL 应用程序中,我需要检测 FORM RESIZING ENDS何时结束。(例如,在用户通过拖动其大小手柄来调整表单大小之后)。

所以我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 组件?

4

1 回答 1

4

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过程

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+将其移动到不同的屏幕Right,则根本不会发送此消息。

于 2020-08-18T21:28:36.240 回答