AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TComboBox unter Windows 10

Ein Thema von EmWieMichael · begonnen am 9. Apr 2021 · letzter Beitrag vom 9. Apr 2021
Antwort Antwort
EmWieMichael

Registriert seit: 28. Mär 2012
85 Beiträge
 
#1

TComboBox unter Windows 10

  Alt 9. Apr 2021, 12:25
Bekanntermaßen wird die ComboBox mit der Eigenschaft 'DropDownList' unter Windows 10 bei Enabled=True grau dargestellt. Ein Verhalten, das weder ich, noch meine Anwender hinnehmen wollen.
Auf 'Stackoverflow' bin ich auf folgende Lösung des Problems gestoßen. Leider zeigen sich meine ComboBoxen (Delphi 10.2) davon völlig unberührt.

Falls also jemand einen Tipp hat, wie man den ComboBoxen einen frischeren Anstrich verpassen kann, wäre ich sehr dankbar.

Delphi-Quellcode:
type
  TComboBoxStyleHookExt= class(TComboBoxStyleHook)
    procedure UpdateColors;
  strict protected
    procedure WndProc(var Message: TMessage); override;
  public
    constructor Create(AControl: TWinControl); override;
  end;

  TWinControlClass= class(TWinControl);

implementation

constructor TComboBoxStyleHookExt.Create(AControl: TWinControl);
begin
  inherited;
  UpdateColors;
end;

procedure TComboBoxStyleHookExt.UpdateColors;
const
  ColorStates: array[Boolean] of TStyleColor = (scComboBoxDisabled, scComboBox);
  FontColorStates: array[Boolean] of TStyleFont = (sfComboBoxItemDisabled, sfComboBoxItemNormal);
var
  LStyle: TCustomStyleServices;
begin
 if Control.Enabled then //use the control colors
 begin
  Brush.Color := TWinControlClass(Control).Color;
  FontColor := TWinControlClass(Control).Font.Color;
 end
 else
 begin //if not enabled. use the current style colors
  LStyle := StyleServices;
  Brush.Color := LStyle.GetStyleColor(ColorStates[Control.Enabled]);
  FontColor := LStyle.GetStyleFontColor(FontColorStates[Control.Enabled]);
 end;
end;

procedure TComboBoxStyleHookExt.WndProc(var Message: TMessage);
begin
 case Message.Msg of
    WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC,
    CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
      begin
        UpdateColors;
        SetTextColor(Message.WParam, ColorToRGB(FontColor));
        SetBkColor(Message.WParam, ColorToRGB(Brush.Color));
        Message.Result := LRESULT(Brush.Handle);
        Handled := True;
      end;
    CM_ENABLEDCHANGED:
      begin
        UpdateColors;
        Handled := False;
      end
  else
    inherited WndProc(Message);
  end;
end;

initialization
  TStyleManager.Engine.RegisterStyleHook(TComboBox, TComboBoxStyleHookExt);
end.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.378 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 12:28
Hast du in deinem Programm denn auch VCL-Styles aktiv? Andernfalls glaube ich kaum, dass der Style-Hook irgendeine Relevanz haben wird.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
85 Beiträge
 
#3

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 13:28
Hast du in deinem Programm denn auch VCL-Styles aktiv? Andernfalls glaube ich kaum, dass der Style-Hook irgendeine Relevanz haben wird.
Da hätte ich doch jeden Schwur abgelegt, dass ich das getestet habe . Funktioniert sofort. Danke für den Hinweis.
Nur kann ich mit den Styles überhaupt nichts anfangen. Wenn noch jemand eine Lösung ohne Styles hat...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.047 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 15:47
Mal doch mal ein Bild um zu zeigen was Du gerne als Ergebnis hättest.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
16.847 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 16:03
Nur kann ich mit den Styles überhaupt nichts anfangen. Wenn noch jemand eine Lösung ohne Styles hat...
Entweder Owner-Draw der ComboBox nutzen, eigene Ableitung schreiben und selbst zeichen oder eine der vielen TCombobox-Alternativen suchen, welche nix mit Theming am Hut hat und auch alles selbst zeichnet.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
85 Beiträge
 
#6

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 17:43
...eigene Ableitung schreiben und selbst zeichen...
Tja, darauf wird es wohl hinauslaufen. Hatte gehofft, dass ich eine einfachere Möglichkeit übersehe.
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
589 Beiträge
 
Delphi 2010 Architect
 
#7

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 19:59
...eigene Ableitung schreiben und selbst zeichen...
Tja, darauf wird es wohl hinauslaufen. Hatte gehofft, dass ich eine einfachere Möglichkeit übersehe.
Die VCL-Styles haben ihren eigenen Hook um die Controls der Form zu Überzeichnen.
Das sich dann mit deinem zusätzlichen Hook nichts tut sollte klar sein.

Aber irgendwie verstehe ich dein Problem nicht.

So wie Bernhard Geyer: sagt Ohne VCL-Styles und alles selber machen... oder nur die VCL-Styles ohne Hook verwenden.
Die Comboboxen werden ja abhängig vom verwendeten Skin schon Überzeichnet du würdest also alles doppelt machen, was die Styles wenn sie richtig funktionieren nicht zulassen würden\sollten.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.378 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TComboBox unter Windows 10

  Alt 9. Apr 2021, 23:08
Da der Hook später registriert wird als der VCL-eigene hat er auch Vorrang. Es funktioniert ja auch wie gewünscht, wenn man VCL-Styles einschaltet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 +2. Es ist jetzt 16:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf