Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Farbschema auslesen (https://www.delphipraxis.net/167931-farbschema-auslesen.html)

hoika 26. Apr 2012 09:07

Farbschema auslesen
 
Hallo #,

folgender Code liest das Farbschema von Windows aus
( aus http://www.swissdelphicenter.ch/de/showcode.php?id=1646)
Delphi-Quellcode:
uses ComObj, SyncObjs, ActiveX;

var
  GetCurrentThemeName: function (pszThemeFileName: LPWSTR; cchMaxNameChars: Integer;
    pszColorBuff: LPWSTR; cchMaxColorChars: Integer; pszSizeBuff: LPWSTR;
    cchMaxSizeChars: Integer): HRESULT; stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName, ColorScheme, SizeName: WideString;
  hThemeLib: THandle;
begin
  try
    CoInitialize(NIL);

    hThemeLib := LoadLibrary('uxtheme.dll');
    if hThemeLib > 0 then
      GetCurrentThemeName := GetProcAddress(hThemeLib, 'GetCurrentThemeName');
    if Assigned(GetCurrentThemeName) then
    begin
      SetLength(FileName, 255);
      SetLength(ColorScheme, 255);
      SetLength(SizeName, 255);
      OleCheck(GetCurrentThemeName(PWideChar(FileName), 255,
        PWideChar(ColorScheme), 255, PWideChar(SizeName), 255));
      // show the the theme path and file name.
      ShowMessage(PWideChar(FileName));
      // show the color scheme name
      ShowMessage(PWideChar(ColorScheme));
      // show the size name
      ShowMessage(PWideChar(SizeName));
    end;
  finally
    FreeLibrary(hThemeLib);
  end;
end;
Problem:
Auf einer virtuellen Maschine klappt es (XP mit XP-Mode, normale Farbeinstellung.

Stelle ich um auf "klassisch" und "Kontrast schwarz", kommt bei OleCheck(GetCurrentThemeName
die Meldung "Element nicht gefunden".

Was ist das denn ?

Das Problem scheint darab zu liegen, dass es bei klassisch ja keine Themes gibt (?)

Heiko
die

himitsu 26. Apr 2012 09:20

AW: Farbschema auslesen
 
Zitat:

Das Problem scheint darab zu liegen, dass es bei klassisch ja keine Themes gibt (?)
Jupp.

Und nein, das ließt nicht das Windows Farbshema aus, sondern das Farbschema des aktiven Theme.

Über clScrollBar bis clMenuBar kommst du an die Farben der WinControls (wenn man sie sich vorher nach RGB konvertiert), aber zum Malen sind sie auch direkt nutzbar.




Seit einer Weile, ich weiß nicht genau seit wann (daheim könnt ich mal nachsehn), könnte man auch die Unit UxTheme verwenden.

Ist 'ne Übersetzung des Headers uxtheme.h .

Dort gibt es noch ein paar Zusatzfunktionen
Delphi-Quellcode:
procedure FreeThemeLibrary;
function InitThemeLibrary: Boolean; // läd ebenfalls in Variablen ala "GetCurrentThemeName" die Funktionszeiger
function UseThemes: Boolean;
UseThemes sieht so aus
Delphi-Quellcode:
function UseThemes: Boolean;
begin
  if (ThemeLibrary > 0) then
    Result := IsAppThemed and IsThemeActive
  else
    Result := False;
end;


//also
{UseThemes} := Assigned(IsAppThemed) and Assigned(IsThemeActive) and IsAppThemed and IsThemeActive;

hoika 26. Apr 2012 09:55

AW: Farbschema auslesen
 
Hallo,

UxTheme benutze ich.
Das Problem ist aber folgendes.

Der User stellt "Kontrast schwarz" ein.

Damit ist der Button-Hintergrudn schwarz, der Font-Color weiss (naja, so in etwa).

Diese Font.color brauch ich, weil bei TBitButton das Color Schema nicht richtig umgesetzt.

Ich will halt sowas machen:

Delphi-Quellcode:
if not ThemeIsActive then
begin
  BitButton1.Font.Color:= cl ???
end;


Heiko

uligerhardt 26. Apr 2012 10:05

AW: Farbschema auslesen
 
Zitat:

Zitat von hoika (Beitrag 1163607)
Delphi-Quellcode:
if not ThemeIsActive then
begin
  BitButton1.Font.Color:= cl ???
end;

clBtnText? Ggfs. kannst du auch clWindowText probieren.

hoika 26. Apr 2012 10:10

AW: Farbschema auslesen
 
Hallo,

wollte ich gerade reinschreiben ;)

Dös passt.

Danke


Heiko

uligerhardt 26. Apr 2012 10:16

AW: Farbschema auslesen
 
Zitat:

Zitat von hoika (Beitrag 1163610)
Dös passt.

Cool. Und immer dran denken: Vorder- und Hintergrundfarbe schön pärchenweise setzen, also
Delphi-Quellcode:
AControl.Font.Color := clBtnText
und
Delphi-Quellcode:
AControl.Color := clBtnFace
(siehe hier).

hoika 26. Apr 2012 15:42

AW: Farbschema auslesen
 
Hallo,

beim ersten Durchlesen hatte ich noch gedacht,
wat soll der M... ;)

Dann kam die Erleuchtung.

Danke!


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz