windows - 当主窗体最小化/防止自动恢复时隐藏 fsStayOnTop 窗体

标签 windows delphi delphi-2007

我有一个类似于 question asked here 的主窗体和状态窗体.但是,我的状态窗口的 F​​ormStyle 是 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;

最佳答案

我能想到的唯一解释是您的应用程序的 MainFormOnTaskbar 设置为 false。

如果是这样的话,当你的应用程序被最小化时,主窗体实际上并没有被最小化,而是根据VCL的最小化机制被隐藏了。当您发送一条“wParam”设置为 True 的 WM_SETREDRAW 消息时,您将强制显示隐藏(未最小化)的主窗体窗口。

在此阶段,应用程序仍根据 VCL 最小化,因为它从未恢复过。当您单击主窗体的最小化按钮时,VCL 调用 TApplication.Minimize 并看到应用程序窗口 已经最小化,因此无需进一步操作就返回,因此主窗体没有最小化。

这是一个可以重现该问题的简单示例。在项目源中将 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);
    ...

关于windows - 当主窗体最小化/防止自动恢复时隐藏 fsStayOnTop 窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387116/

相关文章:

c++ - 操作HNet_ConnectionProperties的C++代码是什么

javascript - Delphi CEF4 Chromium - 执行 javascript 操作

delphi - 如何克服条件定义的 255 个字符限制?

delphi - 如何捕获 TDataModule.OnCreate 事件中的异常?

multithreading - 从 OnTimer 事件访问父窗体中的变量 - 获取异常

Delphi DLL 未卸载,可能是由于仍在分配的 GDI

Windows 无法为新数据库实例启动 DBConsole

windows - Qt Creator由于错误的link.exe路径而无法打开CMake项目

.net - 为什么 .net 中不包含 Windows 常量?

web-services - Delphi 2007 生成不正确的 SOAP 消息