How to colorize a TComboBox background with VCL styles enabled

I am trying to color the background of TComboBox with VCL styles enabled, as described in this article, but does not work.

http://theroadtodelphi.wordpress.com/2012/02/06/changing-the-color-of-edit-controls-with-vcl-styles-enabled/

+1
source share
1 answer

Depending on the version of Delphi you should

Delphi XE2

For Delphi XE2 you have to write Style Hook

uses Vcl.Styles, Vcl.Themes; type TComboBoxStyleHookExt= class(TComboBoxStyleHook) procedure UpdateColors; strict protected procedure WndProc(var Message: TMessage); override; public constructor Create(AControl: TWinControl); override; end; TWinControlClass= class(TWinControl); { TComboBoxStyleHookExt } 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); 

Delphi XE3 / XE4

Just remove the seClient value from StyleElements propertty

  ComboBox1.StyleElements:=[seFont, seBorder]; ComboBox2.StyleElements:=[seFont, seBorder]; ComboBox3.StyleElements:=[seFont, seBorder]; 

enter image description here

+8
source

All Articles