如何将窗体边框更改为 Windows Basic 而不是 Aero 样式?
Posted
技术标签:
【中文标题】如何将窗体边框更改为 Windows Basic 而不是 Aero 样式?【英文标题】:How to change Form Border to Windows Basic instead of Aero Style? 【发布时间】:2015-04-11 18:02:37 【问题描述】:我想知道是否可以,如果可以,如何将表单边框样式更改为 Windows Basic 而不是 Aero 主题?显然首先考虑到是否启用了 Aero,如果没有,则无需尝试更改边框样式。
所以而不是:
我们会:(模拟图像)
MDI 应用程序已经为子窗体执行此操作,但我不想要或不需要 MDI 应用程序。我尝试查看 Vcl.Forms 的源代码,看看是否可以找到任何相关内容,但我无法找到 - 我可能是错的,但我实际上认为 MDI Forms 的绘制方式是由 Windows 决定的,而不是由 Delphi 决定的。
DSiWin32 包含一些与 Aero 相关的功能,例如确定 Aero 是否启用,以及能够启用和禁用 Aero - 但是这似乎是系统范围的更改,而不是以每个窗体/窗口为基础,它还会在更改主题时导致屏幕延迟,这不好。
我现在不确定从哪里开始。我可能忽略了一些简单的事情吗?我们是否需要使用一些特定的标志等创建和覆盖我们自己的 TForm 来实现这一点,或者可能有一种方法可以随时更改表单样式,例如为表单启用/禁用 Aero?
简单地说,我想知道是否可以不使用 MDI 应用程序,如果首先启用 Aero,我们可以将任何窗体/窗口边框更改为 Windows Basic 主题吗?
【问题讨论】:
【参考方案1】:调用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
:
【讨论】:
非常感谢您(非常感谢您的解释)-Winapi.Dwmapi
是魔法所在:) 但是您是如何知道DwmSetWindowAttribute
though 的?我查看了 MSDN 上的一些 Windows API 页面,但没有找到我想要的东西。我不知道你们是怎么知道这些比较晦涩的功能的。
我通过回答和尝试回答这样的问题来学习。
我想我会花更多时间阅读 Windows API 和 MSDN,这是一个很好的资源(特别是如果您知道要查找什么)。再次感谢。以上是关于如何将窗体边框更改为 Windows Basic 而不是 Aero 样式?的主要内容,如果未能解决你的问题,请参考以下文章