最小化表单时窗口状态错误

问题描述 投票:0回答:1

当我的

MainForm
不可见时,我遇到了问题。

我用

TForm
TTimer
重现它(间隔5秒)。 计时器方法更改 MainForm 的位置:

Timer.Enabled := False;    
Application.MainForm.Bounds := TRect.Create(0, 0, 200, 200);

如果在计时器事件期间最小化表单,则表单的位置不会改变。我尝试更改

WindowState
,但是当我记录它时,我有
wsNormal
而不是
wsMinimized
:

Timer.Enabled := False;    

if Application.MainForm.WindowState = wsMinimized then // never got wsMinimized
  Application.MainForm.WindowState = wsNormal;

Application.MainForm.Bounds := TRect.Create(0, 0, 200, 200);

我找到的唯一解决方案是在更改边界之前在计时器事件中添加此调用:

ShowWindow(WindowHandleToPlatform(GetMainForm.Handle).Wnd, SW_RESTORE);

为什么

WindowState
wsNormal
而不是
wsMinimized
?我可以检查哪些属性来了解我的表单是否最小化?

delphi firemonkey
1个回答
0
投票

1 - FMX 上的窗口状态等于最后写入的值
当您获得状态时,您会收到最后写入的值。默认值是 wsNormal 当通过窗口最小化按钮最小化表单时不会更改(阅读 FMX 代码并使用断点进行测试)。在 FMX 上包装了 SetWindowsState,但没有包装 GetWindowsState

IFMXWindowService = interface(IInterface)
['{26C42398-9AFC-4D09-9541-9C71E769FC35}']
function FindForm(const AHandle: TWindowHandle): TCommonCustomForm;
function CreateWindow(const AForm: TCommonCustomForm): TWindowHandle;
procedure DestroyWindow(const AForm: TCommonCustomForm);
procedure ReleaseWindow(const AForm: TCommonCustomForm);
procedure SetWindowState(const AForm: TCommonCustomForm; const AState: TWindowState); // here
procedure ShowWindow(const AForm: TCommonCustomForm);
procedure HideWindow(const AForm: TCommonCustomForm);
function ShowWindowModal(const AForm: TCommonCustomForm): TModalResult;
procedure InvalidateWindowRect(const AForm: TCommonCustomForm; R: TRectF);
procedure InvalidateImmediately(const AForm: TCommonCustomForm);
procedure SetWindowRect(const AForm: TCommonCustomForm; ARect: TRectF);
function GetWindowRect(const AForm: TCommonCustomForm): TRectF;
function GetClientSize(const AForm: TCommonCustomForm): TPointF;
procedure SetClientSize(const AForm: TCommonCustomForm; const ASize: TPointF);
procedure SetWindowCaption(const AForm: TCommonCustomForm; const ACaption: string);
procedure SetCapture(const AForm: TCommonCustomForm);
procedure ReleaseCapture(const AForm: TCommonCustomForm);
function ClientToScreen(const AForm: TCommonCustomForm; const AFormPoint: TPointF): TPointF;
function ScreenToClient(const AForm: TCommonCustomForm; const AScreenPoint: TPointF): TPointF;
procedure BringToFront(const AForm: TCommonCustomForm);
procedure SendToBack(const AForm: TCommonCustomForm);
procedure Activate(const AForm: TCommonCustomForm);
function GetWindowScale(const AForm: TCommonCustomForm): Single; deprecated; // Use THandle.Scale instead
function CanShowModal: Boolean;
end;

2 - 如果你想在窗口中获取窗口的状态 你需要:

  • add 使用 FMX.Platform.Win 和 Winapi.Windows
  • 使用winapi GetWindowPlacement

procedure GetState
var 
  state : TWindowPlacement;
begin
  GetWindowPlacement( WindowHandleToPlatform(Application.MainForm.Handle).wnd, state);
end;

如果 state.showCmd 有 2 表示 Form 最小化 showCmd 的可能值列表在这里 ShowWindow 函数 (winuser.h)

Delphi 没有包装其他可以检查状态的属性。 在VCL应用程序中没有这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.