我有一个主要表单和一个类似于question asked here的状态表单。但是,我的状态窗口的FormStyle是fsStayOnTop,当我尝试在状态窗口显示时最小化主窗体时会导致一些奇怪的行为。
当我最小化主窗体时,两个窗体都按预期隐藏,但是当状态窗体完成其最小化时完成其任务时,主窗体自动恢复自身并且其最小化按钮不再起作用(但最大化/恢复/关闭所有仍然工作)。使最小化功能再次起作用的唯一方法是重新启动应用程序。如果我将FormStyle设置为其他任何东西,一切正常,但我的应用程序要求状态窗体在可见时保持在顶部。
主窗体是否有自动恢复的原因?有办法解决这个问题吗?
procedure ButtonClick(sender:TObject);
begin
//Gather some data
ShowStatusWindow; // sets status window to visible, does its work,
// then sets invisible. (Usually visible for about 10 seconds)
//Gather more data
Windows.SendMessage(self.Handle, WM_SETREDRAW, 0, 0); //Freeze the main form for
//flickerless drawing
// Handle everything that would cause a redraw
Windows.SendMessage(self.Handle, WM_SETREDRAW, 1, 0); // thaw form
RedrawWindow(self.Handle, 0, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
答案 0 :(得分:5)
我能提出的唯一解释是,您的应用程序的MainFormOnTaskbar
设置为false。
如果是这种情况,当您的应用程序最小化时,主窗体实际上不会被最小化,而是根据VCL的最小化机制隐藏。当您发送WM_SETREDRAW
消息并将'wParam'设置为True时,您将强制显示隐藏(未最小化)主窗体的窗口。
在此阶段,应用程序仍然根据VCL进行最小化,因为它从未被恢复过。当您单击主窗体的最小化按钮时,VCL会调用TApplication.Minimize
并看到应用程序窗口已经最小化,因此无需进一步操作即可返回,因此主窗体不会最小化。 / p>
这是一个可以复制问题的简单示例。在项目源中将MainFormOnTaskbar
设置为false。运行该应用程序,然后单击按钮:
procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Minimize;
SendMessage(Handle, WM_SETREDRAW, 1, 0);
// ShowWindow(Handle, SW_SHOWNORMAL); // this will also do the same
end;
之后你将无法最小化表格。
要解决,您可以检查主要表格是否可见f.i.在禁用绘图之前:
if IsWindowVisible(Handle) then begin
Windows.SendMessage(self.Handle, WM_SETREDRAW, 0, 0);
...