当我的MainForm
不可见时,我遇到问题。
我用TForm
和TTimer
(间隔5秒)复制它。timer方法更改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
?我可以检查什么属性来知道我的表单是否最小化?
1条答案
按热度按时间nr7wwzry1#
1 -FMX上的窗口状态等于最后写入的值
当你得到状态时,你会收到最后一个写入的值。默认值为wsNormal,当窗体通过窗口最小化按钮最小化时,不会改变(已阅读FMX代码并使用断点进行测试)。在FMX上 Package SetWindowsState,但不 Package UpdateWindowsState
2 -如果你想在windows中获取你的窗口的状态,你需要:
如果state.showCmd有2意味着表单被最小化,
showCmd可能值列表在这里是ShowWindow function (winuser.h)
Delphi 没有 Package 其他属性,您可以在其中检查状态。在VCL应用程序中没有这个问题,表单在最小化时会调整大小
UPDATE:FMX简单地说,来自OS的windows minimize消息不会更新变量Windows状态,而VCL会发生这种情况,因为订阅了WM_WINDOWPOSCHANGING消息,并使用此消息调用更新窗口状态的函数。在FMX中,窗体不直接订阅Windows消息,窗口的接口是一个实现“interface”的对象,该对象具有对窗口有用的函数(如SetWindowState)。
我发现在最小化时写入绑定,将立即自动发送另一个带有先前值的绑定集