如何将 Form Border 改为 Windows Basic 而不是 Aero Style?

How to change Form Border to Windows Basic instead of Aero Style?

我想知道是否可以,如果可以,如何将表单边框样式更改为 Windows Basic 而不是 Aero 主题?显然首先要考虑是否启用 Aero,如果未启用则无需尝试更改边框样式。

所以代替:

我们会:(模型图像)

MDI 应用程序已经为子窗体执行此操作,但我不想要也不需要 MDI 应用程序。我试着查看 Vcl.Forms 的源代码,看看我是否能找到任何相关的东西,但我找不到——我可能是错的,但我实际上认为 MDI 表单的绘制方式是由 Windows 决定的,不是 Delphi.

DSiWin32 包含几个与 Aero 相关的函数,例如确定 Aero 是否启用,以及能够启用和禁用 Aero - 但是这似乎是系统范围的更改而不是每个 Form/Window 基础上,这也会导致在更改主题时出现屏幕延迟,这是不好的。

我现在不确定该从哪里开始。我可能忽略了一些简单的事情吗?我们是否需要用一些特定的标志等创建和覆盖我们自己的 TForm 来实现这一点,或者可能有一种方法可以随时更改表单样式,例如 Enable/Disable Aero for the form?

简单地说,我想知道是否可以不求助于 MDI 应用程序,我们是否可以将任何 Form/Window 边框更改为 Windows 基本主题,前提是首先启用 Aero?

调用 DwmSetWindowAttribute 传递值为 DWMNCRP_DISABLEDDWMWA_NCRENDERING_POLICY 属性。

type
  TForm1 = class(TForm)
  protected
    procedure CreateWnd; override;
  end;

procedure TForm1.CreateWnd;
var
  Policy: Integer;
begin
  inherited;
  Policy := DWMNCRP_DISABLED;
  DwmSetWindowAttribute(WindowHandle, DWMWA_NCRENDERING_POLICY, @Policy, 
    SizeOf(Policy));
end;

我在这里忽略了错误检查。您可能会确定响应错误是值得的。我也没有测试操作系统是否支持这个函数调用,但是如果你需要支持XP,你可以选择这样做。

注意 CreateWnd 是调用 DwmSetWindowAttribute 的正确位置。 window 句柄是在 CreateWnd 中创建的,我们希望尽快应用此策略。将代码放在 CreateWnd 中也可以使其对重新创建具有鲁棒性。

普通航空形态:

调用 DwmSetWindowAttribute 的表单: