use*_*348 3 forms delphi window-resize delphi-10.4-sydney
在 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;
Run Code Online (Sandbox Code Playgroud)
但调整窗体大小后,事件处理WM_EXITSIZEMOVE程序不会执行。
那么我如何检测表单调整大小结束,也许通过使用 TApplicationEvents 组件?
消息直接WM_EXITSIZEMOVE发送到窗口。因此,它不会被 的处理程序检测到TApplicationEvents,OnMessage因为它只检测发布到主消息队列的消息。
因此,您需要重写表单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;
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用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;
Run Code Online (Sandbox Code Playgroud)
但是,请注意,正如其名称所暗示的,该消息不仅在调整窗口大小时发送,而且还在窗口移动后发送。并且在这两种情况下,仅当操作涉及模态循环时。
例如,如果您通过双击标题栏来最大化窗口,或者如果您通过按Shift+ Win+将其移动到不同的屏幕Right,则根本不会发送此消息。