delphi - 如何将窗体边框更改为 Windows Basic 而不是 Aero Style?

标签 delphi themes aero

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

所以代替:

enter image description here

我们会有:(模型图像)

enter image description here

MDI 应用程序已经为子表单执行此操作,但我不想要或不需要 MDI 应用程序。我尝试查看 Vcl.Forms 的源代码,看看是否可以找到任何相关内容,但我无法找到 - 我可能是错的,但我实际上认为 MDI 窗体的绘制方式是由 Windows 决定的,而不是 Delphi。

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

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

简单地说,我想知道是否可以在不诉诸 MDI 应用程序的情况下将任何表单/窗口边框更改为 Windows Basic 主题,前提是首先启用 Aero?

最佳答案

调用DwmSetWindowAttribute传递值为 DWMNCRP_DISABLEDDWMWA_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 中还可以使其对重新创建具有鲁棒性。

普通航空形式:

enter image description here

通过调用DwmSetWindowAttribute形成表单:

enter image description here

关于delphi - 如何将窗体边框更改为 Windows Basic 而不是 Aero Style?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29581229/

相关文章:

Delphi Graphics32 相对鼠标位置(相对于图层)

ExtJS 主题集中化

netbeans - 如何在netbeans 8中安装sublime monokai主题

.NET:如何在窗口最大化时获取 ActiveCaptionText 颜色?

Delphi:在 Vista 和 aero 中以标题形式绘制文本,如 Windows 7

delphi - 如何获取 WbemScripting 查询返回的列的名称?

regex - 如何在 Delphi (Win32) 中查找硬错误接口(interface)转换

multithreading - 关闭申请后的文件复制

更改我的 CTAGS 主题

python - Python 中的 Windows 7 MARGINS 结构