我想知道是否有可能,如果有,如何将窗体边框样式更改为 Windows Basic 而不是 Aero 主题?显然首先考虑Aero是否启用,如果没有,则无需尝试更改边框样式。
所以而不是:
我们会有:(模拟图像)
MDI 应用程序已经为子窗体执行了此操作,但我不想要或不需要 MDI 应用程序。我尝试查看 Vcl.Forms 的源代码,看看我是否能找到任何相关的东西,但我找不到 - 我可能是错的,但我实际上认为 MDI 窗体的绘制方式是由 Windows 决定的,而不是由 Delphi 决定的。
DSiWin32 包含一些与 Aero 相关的功能,例如确定是否启用 Aero,以及能够启用和禁用 Aero - 但是这似乎是系统范围的更改,而不是针对每个窗体/窗口基础上,它也会在主题更改时导致屏幕延迟,这是不好的。
我现在不确定从哪里开始。有什么简单的事情我可能忽略了?我们是否需要使用一些特定的标志等创建和覆盖我们自己的 TForm 来实现这一点,或者可能有一种方法可以随时更改表单样式,例如启用/禁用表单的 Aero?
简单地说,我想知道是否可以不使用 MDI 应用程序,如果首先启用 Aero,我们可以将任何窗体/窗口边框更改为 Windows Basic 主题吗?
最佳答案
调用 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
中还可以使其对重新创建具有鲁棒性。普通航空形式:
调用
DwmSetWindowAttribute
的表单: