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

时间:2015-04-11 18:02:37

标签: delphi themes aero

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

所以而不是:

enter image description here

我们会:(模拟图像)

enter image description here

MDI应用程序已针对子表单执行此操作,但我不想要或不需要MDI应用程序。我试着查看Vcl.Forms的来源,看看我是否能找到任何相关的东西,但我无法 - 我可能错了,但我实际上认为MDI Forms的绘制方式是由Windows决定的,而不是Delphi。

DSiWin32包含一些与Aero相关的功能,例如确定Aero是否已启用,以及是否能够启用和禁用Aero - 但这似乎是系统范围的更改,不是基于每个窗体/窗口,它也会导致屏幕延迟,而主题被更改,这是不好的。

我不确定此时从哪里开始。我可能忽略了一些简单的事情吗?我们是否需要创建和覆盖我们自己的TForm以及一些特定的标志等来实现这一点,或者可能有一种方法可以在任何时候改变表单样式,例如为表单启用/禁用Aero?

简单地说,我想知道如果不使用MDI应用程序是否可行,我们是否可以将任何窗体/窗口边框更改为Windows Basic主题,只要首先启用Aero?

1 个答案:

答案 0 :(得分:5)

致电DwmSetWindowAttribute,将DWMWA_NCRENDERING_POLICY属性传递给DWMNCRP_DISABLED

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的正确位置。窗口句柄是在CreateWnd中创建的,我们希望尽快应用此策略。将代码放在CreateWnd中也可以强化重新创建。

普通航空表格:

enter image description here

致电DwmSetWindowAttribute

的表格

enter image description here