如何将窗体边框更改为 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 是魔法所在:) 但是您是如何知道DwmSetWindowAttributethough 的?我查看了 MSDN 上的一些 Windows API 页面,但没有找到我想要的东西。我不知道你们是怎么知道这些比较晦涩的功能的。 我通过回答和尝试回答这样的问题来学习。 我想我会花更多时间阅读 Windows API 和 MSDN,这是一个很好的资源(特别是如果您知道要查找什么)。再次感谢。

以上是关于如何将窗体边框更改为 Windows Basic 而不是 Aero 样式?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?

将 y 轴标签的位置更改为 windows 窗体图表的底部

winform设计窗体界面边框怎么设置

winform 无边框的窗体如何隐藏

VS中如何美化界面 去掉窗体边框

c# winform panel 边框样式设置