Как да получите цвета на шрифта на тематичния надпис на TGroupBox

Бих искал да получа цвета на шрифта на надпис на 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;

person ZigiZ    schedule 25.11.2012    source източник


Отговори (1)


Мисля, че това работи:

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)

person Andreas Rejbrand    schedule 25.11.2012
comment
За какво се отнася Handle? формата? - person ZigiZ; 25.11.2012
comment
@ZigiZ, да, най-вероятно е предназначен да бъде манипулатор на формуляра. - person TLama; 25.11.2012
comment
@user539484: Благодаря ви, че посочихте това. За съжаление, винаги съм вярвал, че това е правилният начин да правя нещата и не съм сигурен какво трябва да направя вместо това. Моля, опишете по-подробно. - person Andreas Rejbrand; 25.11.2012
comment
Аз използвам същото и сега също съм малко объркан. Нито OpenThemeData, нито CloseThemeData препратката не казва изрично, че трябва да затворите този манипулатор. Но бележката в CloseThemeData аз разбирам така, че трябва да го извикате, когато прозорец който използва манипулатора на темата за изобразяването си бъде унищожен (или когато се получи съобщението WM_THEMECHANGED). Така че бих казал, че трябва да се приема като манипулатор на другия системен обект - когато го отваряте, внимавайте да го затворите и в този случай това е, което използваме най-безопасният начин. @user539484, какво мислиш? - person TLama; 25.11.2012
comment
@Andreas, най-лесният начин за заобиколно решение това е IMHO да използвате това, което ZigiZ е показал в актуализацията на отговора си, и просто да помолите ThemeServices (вече отхвърлено) да ви даде Theme манипулатор за определен елемент. След това ThemeServices ще се погрижи да затвори всички отворени манипулатори при финализиране на Themes единица. - person TLama; 25.11.2012
comment
Е, тази кодова конструкция предполага какво GetThemeColor може да хвърли изключение, но не може. Вместо това може да върне отрицателно HRESULT, за който случай никога не се проверява. @TLama, работата е както обикновено, придобихте обект - вие сте отговорни за освобождаването му. - person OnTheFly; 25.11.2012
comment
Изглежда, че няма значение дали извиквате CloseThemeData или не. OpenThemeData връща някакъв вид псевдо манипулатор и затварянето на данните за темата няма никакъв ефект върху манипулатора, който по-късно ще бъде отворен. Може би ще има значение, ако сте затворили данните за темата в последния прозорец на системата (за този пример). - person Sertac Akyuz; 25.11.2012
comment
Лично аз не вярвам какво изтичане на HTHEME може да причини някакъв хаос, но все пак бих написал код, който може, защото е добър навик :-) - person OnTheFly; 25.11.2012
comment
@Andreas Rejbrand, просто оградете повикването с OleCheck и рамката за изключение ще намери своето приложение. - person OnTheFly; 25.11.2012