我想知道是否可能,如果可以,如何将表单边框样式更改为 Windows Basic 而不是 Aero 主题?显然首先要考虑Aero是否启用,如果没有则无需尝试更改边框样式。
所以代替:
我们会有:(模型图像)
MDI 应用程序已经为子表单执行此操作,但我不想要或不需要 MDI 应用程序。我尝试查看 Vcl.Forms 的源代码,看看是否可以找到任何相关内容,但我无法找到 - 我可能是错的,但我实际上认为 MDI 窗体的绘制方式是由 Windows 决定的,而不是 Delphi。
DSiWin32包含一些与 Aero 相关的功能,例如确定是否启用 Aero,以及能够启用和禁用 Aero - 然而,这似乎是系统范围内的更改,而不是基于每个窗体/窗口,当主题改变时,它还会导致屏幕延迟,这不好。
我现在不确定该从哪里开始。有什么简单的事情我可能忽略了吗?我们是否需要使用一些特定的标志等创建和覆盖我们自己的 TForm 来实现此目的,或者可能有一种方法可以随时更改表单样式,例如为表单启用/禁用 Aero?
简单地说,我想知道是否可以在不诉诸 MDI 应用程序的情况下将任何表单/窗口边框更改为 Windows Basic 主题,前提是首先启用 Aero?
最佳答案
调用DwmSetWindowAttribute
传递值为 DWMNCRP_DISABLED
的 DWMWA_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
的正确位置。窗口句柄是在CreateWnd
中创建的,我们希望尽快应用此策略。将代码放入 CreateWnd
中还可以使其对重新创建具有鲁棒性。
普通航空形式:
通过调用DwmSetWindowAttribute
形成表单:
关于delphi - 如何将窗体边框更改为 Windows Basic 而不是 Aero Style?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581229/