Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TComboBox unter Windows 10 (https://www.delphipraxis.net/207569-tcombobox-unter-windows-10-a.html)

EmWieMichael 9. Apr 2021 11:25

TComboBox unter Windows 10
 
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.

Uwe Raabe 9. Apr 2021 11:28

AW: TComboBox unter Windows 10
 
Hast du in deinem Programm denn auch VCL-Styles aktiv? Andernfalls glaube ich kaum, dass der Style-Hook irgendeine Relevanz haben wird.

EmWieMichael 9. Apr 2021 12:28

AW: TComboBox unter Windows 10
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1486773)
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 :oops:. 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...

KodeZwerg 9. Apr 2021 14:47

AW: TComboBox unter Windows 10
 
Mal doch mal ein Bild um zu zeigen was Du gerne als Ergebnis hättest.

Bernhard Geyer 9. Apr 2021 15:03

AW: TComboBox unter Windows 10
 
Zitat:

Zitat von EmWieMichael (Beitrag 1486777)
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.

EmWieMichael 9. Apr 2021 16:43

AW: TComboBox unter Windows 10
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1486787)
...eigene Ableitung schreiben und selbst zeichen...

Tja, darauf wird es wohl hinauslaufen. Hatte gehofft, dass ich eine einfachere Möglichkeit übersehe.

venice2 9. Apr 2021 18:59

AW: TComboBox unter Windows 10
 
Zitat:

Zitat von EmWieMichael (Beitrag 1486790)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1486787)
...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.

Uwe Raabe 9. Apr 2021 22:08

AW: TComboBox unter Windows 10
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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