加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何将Form Border更改为Windows Basic而不是Aero Sty

发布时间:2020-12-15 09:23:09 所属栏目:大数据 来源:网络整理
导读:我想知道是否可能,如果可以,如何将表单边框样式更改为 Windows Basic而不是Aero主题?显然,首先考虑Aero是否启用,如果不启用,则无需尝试更改边框样式. 所以代替: 我们会:(模拟图像) MDI应用程序已经为子表单执行此操作,但我不想要或不需要MDI应用程序.我试
我想知道是否可能,如果可以,如何将表单边框样式更改为 Windows Basic而不是Aero主题?显然,首先考虑Aero是否启用,如果不启用,则无需尝试更改边框样式.

所以代替:

我们会:(模拟图像)

MDI应用程序已经为子表单执行此操作,但我不想要或不需要MDI应用程序.我试着查看Vcl.Forms的来源,看看我是否能找到任何相关的东西,但我无法 – 我可能是错的但我实际上认为绘制MDI表单的方式是由Windows而不是Delphi决定的.

DSiWin32包含一些与Aero相关的功能,例如确定Aero是否已启用,以及能够启用和禁用Aero – 但这似乎是系统范围的更改,而不是每个窗体/窗口基础,它也导致屏幕延迟,而主题改变,这是不好的.

我不确定在这一点上去哪里.我可能忽略了一些简单的事情吗?我们是否需要创建和覆盖我们自己的TForm以及一些特定的标志等来实现这一点,或者可能有一种方法可以在任何时候改变表单样式,例如为表单启用/禁用Aero?

简单地说,我想知道是否可以不使用MDI应用程序,我们是否可以将任何窗体/窗口边框更改为Windows Basic主题,只要首先启用Aero?

解决方法

调用 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的表单:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读