AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Farbschema auslesen

Ein Thema von hoika · begonnen am 26. Apr 2012 · letzter Beitrag vom 26. Apr 2012
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

Farbschema auslesen

  Alt 26. Apr 2012, 09:07
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
Heiko

Geändert von hoika (26. Apr 2012 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#2

AW: Farbschema auslesen

  Alt 26. Apr 2012, 09:20
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Apr 2012 um 09:28 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Farbschema auslesen

  Alt 26. Apr 2012, 09:55
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
Heiko

Geändert von hoika (26. Apr 2012 um 09:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Farbschema auslesen

  Alt 26. Apr 2012, 10:05
Delphi-Quellcode:
if not ThemeIsActive then
begin
  BitButton1.Font.Color:= cl ???
end;
clBtnText? Ggfs. kannst du auch clWindowText probieren.
Uli Gerhardt
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Farbschema auslesen

  Alt 26. Apr 2012, 10:10
Hallo,

wollte ich gerade reinschreiben

Dös passt.

Danke


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Farbschema auslesen

  Alt 26. Apr 2012, 10:16
Dös passt.
Cool. Und immer dran denken: Vorder- und Hintergrundfarbe schön pärchenweise setzen, also AControl.Font.Color := clBtnText und AControl.Color := clBtnFace (siehe hier).
Uli Gerhardt
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Farbschema auslesen

  Alt 26. Apr 2012, 15:42
Hallo,

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

Dann kam die Erleuchtung.

Danke!


Heiko
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 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