我有一个 Delphi 12 主题应用程序。在选项下选择主题(例如)“Iceberg CLassico”。
在运行时,我想查询主题 UI 标题栏颜色和标题栏文本的设置。
我该怎么做?
我想要这个的原因是我在运行时创建带有自定义标题栏(用于标题栏区域中的额外按钮)的表单。当表单在运行时构建并显示自定义标题栏时,它会忽略主表单样式。对话框的其余部分样式正常,只是不是我的自定义标题栏区域。所以我想使用手动设置背景和文本颜色
fname.customtitlebar.BackgroundColor:=Whatever;
fname.customtitlebar.InactiveBackgroundColor:=Whatever;
如果我指定 clgreen 和 clyellow,那么我会在绿色背景上得到黄色文本,因此代码是正确的,只是颜色检测错误。我尝试用
查询主表单颜色fname.customtitlebar.BackgroundColor:=StyleManager.ActiveStyle.GetSystemColor(clActiveCaption);
fname.customtitlebar.InactiveBackgroundColor:=StyleManager.ActiveStyle.GetSystemColor(clActiveCaption);
和
fname.customtitlebar.BackgroundColor:=form1.customtitlebar.BackgroundColor;
fname.customtitlebar.InactiveBackgroundColor:=form1.customtitlebar.InactiveBackgroundColor;
但是他们没有给出正确的颜色。
关于如何提取正确的当前主题标题栏背景和标题栏文本颜色有什么想法吗?
Delphi 中的颜色由 TColorRec 记录表示。系统颜色由 $FF000000 或(按位)0-30 确定。正常颜色从 $00000000 到 $00FFFFFF。当系统颜色发送到进行绘画的 API 时,如果需要,它会根据系统颜色设置颜色。
我确信有一种方法可以通过 API 调用获得正确的颜色,但最简单的可能是在位图中(或画布,如果你已经有的话)绘制一个像素。
var ActualColor: TColor;
var ABitmap := TBitmap.Create(1,1);
try
ABitmap.Canvas.Pixels[0,0] := clHighlight;
ActualColor := ABitmap.Canvas.Pixels[0,0];
finally
ABitmap.Free;
end;
不完全是“最好”的方式,但应该可以正常工作。