How to color the background of a TComboBox with VCL styles enabled

前端 未结 1 893
抹茶落季
抹茶落季 2021-01-25 09:10

I am trying to color the background of a TComboBox with VCL styles enabled like the way its described in this article but its not working.

http://theroadtodelphi.wordpre

相关标签:
1条回答
  • 2021-01-25 09:44

    Depending of your Delphi version you must

    Delphi XE2

    For Delphi XE2 you must write a 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

    Simply remove the seClient value from the StyleElements propertty

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

    enter image description here

    0 讨论(0)
提交回复
热议问题