如何检测 Form Resize END,可能是通过使用 TApplicationEvents 组件?
How to detect Form Resize END, maybe by using the TApplicationEvents component?
在 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 组件?
WM_EXITSIZEMOVE
message is sent directly to the window. Thus, it is not detected by the TApplicationEvents
's OnMessage
处理程序,因为它只检测 发布 到主消息 queue.
的消息
因此,您需要改写表单的 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;
但是,请注意,顾名思义,此消息不仅会在 window 调整大小时发送,还会在 window 移动后发送。在这两种情况下,仅当操作涉及模态循环时。
例如,如果您通过 double-clicking 最大化 window 的标题栏,或者如果您通过按 Shift+ 将其移动到不同的屏幕Win+右,此消息根本没有发送
在 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 组件?
WM_EXITSIZEMOVE
message is sent directly to the window. Thus, it is not detected by the TApplicationEvents
's OnMessage
处理程序,因为它只检测 发布 到主消息 queue.
因此,您需要改写表单的 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;
但是,请注意,顾名思义,此消息不仅会在 window 调整大小时发送,还会在 window 移动后发送。在这两种情况下,仅当操作涉及模态循环时。
例如,如果您通过 double-clicking 最大化 window 的标题栏,或者如果您通过按 Shift+ 将其移动到不同的屏幕Win+右,此消息根本没有发送