gpt4 book ai didi

forms - 如何检测WindowState的变化?

转载 作者:行者123 更新时间:2023-12-03 15:08:52 25 4
gpt4 key购买 nike

如何检测 TCustomForm 后代的 WindowState 更改?我希望在 WindowState 属性设置不同值时随时收到通知。

我检查了 setter 内部是否有事件或虚拟方法,但没有找到任何可以实现我的目标的内容。

function ShowWindow; external user32 name 'ShowWindow';

procedure TCustomForm.SetWindowState(Value: TWindowState);
const
ShowCommands: array[TWindowState] of Integer =
(SW_SHOWNORMAL, SW_MINIMIZE, SW_SHOWMAXIMIZED);
begin
if FWindowState <> Value then
begin
FWindowState := Value;
if not (csDesigning in ComponentState) and Showing then
ShowWindow(Handle, ShowCommands[Value]);
end;
end;

最佳答案

当窗口状态发生更改时,操作系统向窗口发送的通知是 WM_SIZE信息。从您发布的代码引用中并不明显,但 VCL 已经监听 WM_SIZETScrollingWinControl类( TCustomForm 的后代)并调用虚拟 Resizing处理消息时的过程。

因此您可以重写表单的此方法来获取通知。

type
TForm1 = class(TForm)
..
protected
procedure Resizing(State: TWindowState); override;

....

procedure TForm1.Resizing(State: TWindowState);
begin
inherited;
case State of
TWindowState.wsNormal: ;
TWindowState.wsMinimized: ;
TWindowState.wsMaximized: ;
end;
end;


请注意,对于给定状态,可以多次发送通知,例如在调整窗口大小或更改可见性时。您可能需要跟踪先前的值以检测状态何时实际更改。


根据您的要求,您还可以使用OnResize表单的事件。不同之处在于,该事件在操作系统通知窗口有关更改之前触发。 VCL通过调用GetWindowPlacement检索窗口状态信息而TCustomForm正在处理WM_WINDOWPOSCHANGING

下面是一个使用标志来跟踪先前窗口状态的示例。

  TForm1 = class(TForm)
..
private
FLastWindowState: TWindowState; // 0 -> wsNormal (initial value)

...

procedure TForm1.FormResize(Sender: TObject);
begin
if WindowState <> FLastWindowState then
case WindowState of
TWindowState.wsNormal: ;
TWindowState.wsMinimized: ;
TWindowState.wsMaximized: ;
end;
FLastWindowState := WindowState;
end;

关于forms - 如何检测WindowState的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40108892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com