如何获取TGroupBox主题标题字体颜色

3

我想获取TGroupBox标题的字体颜色,以便将该颜色分配给TLabel。

我认为我需要使用GetThemeColor,但是我似乎无法弄清楚要使用哪些参数?


更新 - 这是基于答案我使用的代码:
function GetGroupBoxTextColor: TColor;
var
  C: COLORREF;
  ElementDetails: TThemedElementDetails;
begin
  Result := clWindowText;
  if ThemeServices.ThemesEnabled then
  begin
    ElementDetails := ThemeServices.GetElementDetails(tbGroupBoxNormal);
    if GetThemeColor(ThemeServices.Theme[teButton], ElementDetails.Part, ElementDetails.State, TMT_TEXTCOLOR, C) = S_OK then
      Result := C;
  end;
end;
1个回答

5
我认为这个可以运行:
var
  h: HTHEME;
  clr: COLORREF;
begin
  h := OpenThemeData(Handle, 'BUTTON');
  if h <> 0 then
    try
      OleCheck(GetThemeColor(h, BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, clr));
    finally
      CloseThemeData(h);
    end;

(使用 OleAuto, UxTheme)

2
Handle 是指什么?是指窗体吗? - ZigiZ
@ZigiZ,是的,很可能是表单句柄的意思。 - TLama
1
@user539484:感谢您指出这一点。不幸的是,我一直认为这是正确的做法,而且我不确定我应该怎么做。请详细说明。 - Andreas Rejbrand
1
这段代码结构表明GetThemeColor可能会抛出异常,但实际上它不会。相反,它可能会返回负的HRESULT,而这种情况从未被检查过。@TLama,这是惯例,你已经获取了一个对象 - 你有责任释放它。 - OnTheFly
1
看起来无论你是否调用CloseThemeData都没有关系。OpenThemeData返回某种伪句柄,关闭主题数据对稍后要打开的句柄没有任何影响。也许如果你在系统的最后一个窗口上关闭主题数据会有所影响(以此为例)。 - Sertac Akyuz
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接