Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: So beheben Sie den Farbeinstellungsbefehl für den aktiven Stil unter Windows

  Alt 22. Jul 2022, 12:48
So beheben Sie den Farbeinstellungsbefehl für den aktiven Stil unter Windows:
Code:
Buffer.Canvas.Brush.Color := TStyleManager.ActiveStyle.GetStyleColor (scWindow);
um es auf Delphi 7 nutzbar zu machen?
Einfach den ganzen TStyleManager Krams löschen und die Farbe direkt setzen (clWindow) oder du nutzt den Themes Manager, der bei D7 dabei ist (ThemeServices in der Unit Themes.pas), wenn du die Themes in deiner eigenen Komponente painten willst. Wenn du aber nur die Farben willst, musst du garnichts weiter machen als die Standard Colors nutzen wie clWindow. clButtonFace, etc. Diese haben in einer themed App automatisch die richten Werte, gemäss Windows Theme.

Da man aber anhand deines Codes nicht sieht, wo das benötigt wird, ist es schwer zu sagen wie du das da machen musst. Vermutlich kannst du auch einfach die ganze Zeile löschen, da in einer themed Anwendung (mit einem Manifest) die Windows Themes eh genutzt werden und du dich da garnicht um das Painten kümmern musst. Die Aussage D7 habe keine Styles ist so nicht richtig. Es gab da noch keine Delphi eigenen Styles, aber die Windows Styles (Themes) stehen da zur Verfügung. Über die Themes API könntest du auch die einzlenen Farbwerte abfragen. (siehe GetThemeColor / GetThemeSysColor in UxTheme.pas)

Beispiel D7 Code zum Painten einer eigenen themed Progressbar die auf einem TGraphicControl basiert:
Delphi-Quellcode:
    aRect := ClientRect;
    if ThemeServices.ThemesEnabled then
    begin

      Details := ThemeServices.GetElementDetails(tpBar);
      ThemeServices.DrawElement(Bmp.Canvas.Handle, Details, aRect);
      aRect := ThemeServices.ContentRect(Bmp.Canvas.Handle, Details, aRect);

      ChunkWidth := aRect.Right - aRect.Left;
      FFillWidth := ChunkWidth - Round(ChunkWidth * (100.0 - FillPercent) / 100.0);
      aRect.Right := aRect.Left + FFillWidth;

      Details := ThemeServices.GetElementDetails(tpChunk);
      ThemeServices.DrawElement(Bmp.Canvas.Handle, Details, aRect);
      with Bmp.Canvas do
      begin
        if aShowText then
        begin
          Font.Assign(Self.Font);
          Font.Color := clWindowText;
          Brush.Style := bsClear;
          ThemeServices.DrawText(Handle, Details, aText,
            ClientRect, DT_CENTER or DT_VCENTER or DT_SINGLELINE, 0);
        end;
      end;
    end

Geändert von Rolf Frei (22. Jul 2022 um 16:26 Uhr)
  Mit Zitat antworten Zitat