首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在组件中初始化活动主题的状态?

如何在组件中初始化活动主题的状态?
EN

Stack Overflow用户
提问于 2019-10-20 18:08:04
回答 2查看 123关注 0票数 1

我在一个主题感知组件上工作,当我创建它时,我必须用IsThemeActive (从UxTheme单元)设置初始状态。但是如果我在组件constructor中使用这个函数,我就会遇到访问冲突。在其他任何地方使用它都可以很好地工作。发生了什么?如果我不能在OnCreate中设置初始状态,我如何设置?

我的组件单位:

代码语言:javascript
复制
unit TestUnit;

interface

uses Classes, Windows, Controls, ComCtrls, StdCtrls, CommCtrl, Messages, Forms,
     SysUtils, Graphics, UxTheme;

type
  TSuperList = class(TListView)
  private
    FThemeEnabled: Boolean;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

constructor TSuperList.Create(AOwner: TComponent);
begin
 inherited;
 FThemeEnabled:= IsThemeActive;
end;

end.

在应用程序中使用它:

代码语言:javascript
复制
procedure TForm1.FormCreate(Sender: TObject);
begin
 List1:= TSuperList.Create(Form1);
 List1.Parent:= Form1;
end;
EN

回答 2

Stack Overflow用户

发布于 2019-10-20 21:54:03

我找到了解决方案。我必须先初始化主题库:

代码语言:javascript
复制
unit TestUnit;

interface

uses Classes, Windows, Controls, ComCtrls, StdCtrls, CommCtrl, Messages, Forms,
     SysUtils, Graphics, UxTheme;

type
  TSuperList = class(TListView)
  private
    FThemeEnabled: Boolean;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

var IsThemeEnabled: Boolean;

constructor TSuperList.Create(AOwner: TComponent);
begin
 inherited;
 FThemeEnabled:= IsThemeEnabled;
end;

initialization

 InitThemeLibrary;
 IsThemeEnabled:= IsThemeActive;

end.
票数 3
EN

Stack Overflow用户

发布于 2019-10-21 01:51:41

我已经用我自己的自定义组件测试过这种情况,没有任何AccessViolation。也许是因为我在使用Delphi Tokyo 10.2

1.获取主题状态

但是作为一个想法:您可以覆盖CreateWnd过程来调用IsThemeActive函数,而不是在constructor部分中执行此操作。

如下所示:

代码语言:javascript
复制
procedure TSuperList.CreateWnd;
begin
  Inherited CreateWnd;
  FThemeEnabled := UXTheme.IsThemeActive;
end;

不需要显式初始化主题库。

2.正确处理主题的可访问性

我还想提一下,检查你的应用程序是否应用了视觉风格(-es)是很重要的,因为现在操作系统可以使用视觉风格,但你的应用程序不能。因此,当您的应用程序没有应用主题时,IsThemeActive函数将返回True。这将导致绘制您的组件主题,而另一个组件将绘制非主题。您可以使用IsAppThemed函数查看应用程序当前是否使用了主题。

IsAppThemed的重要说明:

在Windows8之前的版本中,可以在控制面板中关闭视觉样式,以便应用程序可以支持视觉样式,但不会在给定时间应用视觉样式。在Windows 8中,无法关闭视觉样式。

你可能想知道:为什么这两个函数返回True,即使我的应用程序在视觉上没有主题,并且操作系统启用了主题?

我对此没有答案。在IsThemeActive函数返回TrueIsAppThemed函数返回False的情况下,只有一种情况是专门为您的应用程序禁用了视觉外观。下面的图片描述了如何实现这一点(用俄语):

红线上的复选框是为了在操作系统激活主题时“选中”禁用应用程序主题。

下图显示了在禁用应用程序的视觉主题(通过上面描述的方式,这就是IsAppThemed返回False的位置)和活动应用程序主题(IsAppThemed返回True)的情况下,TForm将具有什么样的外观。注意:左边是标准的notepad.exe应用程序,它没有焦点,并且在两种情况下都有主题。

因此,玩弄主题并不是微不足道的。

资料来源:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58471942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档