2012-04-25 19 views

Respuesta

18

El TPanel no utiliza un gancho de estilo para dibujar el control, por lo que no puede utilizar la técnica descrita en el artículo. en su lugar, debe anular el método paint.

Compruebe esta muestra utilizando una clase de intercalador.

type 

    TPanel=Class(Vcl.ExtCtrls.TPanel) 
    protected 
    procedure Paint; override; 
    End; 


Uses 
    Vcl.Styles, 
    Vcl.Themes; 

{$R *.dfm} 

{ TPanel } 

procedure TPanel.Paint; 
const 
    Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER); 
    VerticalAlignments: array[TVerticalAlignment] of Longint = (DT_TOP, DT_BOTTOM, DT_VCENTER); 
var 
    Rect: TRect; 
    LColor: TColor; 
    LStyle: TCustomStyleServices; 
    LDetails: TThemedElementDetails; 
    TopColor  : TColor; 
    BottomColor  : TColor; 
    LBaseColor  : TColor; 
    LBaseTopColor : TColor; 
    LBaseBottomColor: TColor; 
    Flags: Longint; 

    procedure AdjustColors(Bevel: TPanelBevel); 
    begin 
    TopColor := LBaseTopColor; 
    if Bevel = bvLowered then 
     TopColor := LBaseBottomColor; 
    BottomColor := LBaseBottomColor; 
    if Bevel = bvLowered then 
     BottomColor := LBaseTopColor; 
    end; 

begin 
    Rect := GetClientRect; 

    LBaseColor := Color;//use the color property value to get the background color. 
    LBaseTopColor := clBtnHighlight; 
    LBaseBottomColor := clBtnShadow; 
    LStyle := StyleServices; 
    if LStyle.Enabled then 
    begin 
    LDetails := LStyle.GetElementDetails(tpPanelBevel); 
    if LStyle.GetElementColor(LDetails, ecEdgeHighLightColor, LColor) and (LColor <> clNone) then 
     LBaseTopColor := LColor; 
    if LStyle.GetElementColor(LDetails, ecEdgeShadowColor, LColor) and (LColor <> clNone) then 
     LBaseBottomColor := LColor; 
    end; 

    if BevelOuter <> bvNone then 
    begin 
    AdjustColors(BevelOuter); 
    Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); 
    end; 
    if not (LStyle.Enabled and (csParentBackground in ControlStyle)) then 
    Frame3D(Canvas, Rect, LBaseColor, LBaseColor, BorderWidth) 
    else 
    InflateRect(Rect, -Integer(BorderWidth), -Integer(BorderWidth)); 
    if BevelInner <> bvNone then 
    begin 
    AdjustColors(BevelInner); 
    Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth); 
    end; 
    with Canvas do 
    begin 
    if not LStyle.Enabled or not ParentBackground then 
    begin 
     Brush.Color := LBaseColor; 
     FillRect(Rect); 
    end; 

    if ShowCaption and (Caption <> '') then 
    begin 
     Brush.Style := bsClear; 
     Font := Self.Font; 
     Flags := DT_EXPANDTABS or DT_SINGLELINE or 
     VerticalAlignments[VerticalAlignment] or Alignments[Alignment]; 
     Flags := DrawTextBiDiModeFlags(Flags); 
     if LStyle.Enabled then 
     begin 
     LDetails := LStyle.GetElementDetails(tpPanelBackground); 
     if not LStyle.GetElementColor(LDetails, ecTextColor, LColor) or (LColor = clNone) then 
      LColor := Font.Color; 
     LStyle.DrawText(Handle, LDetails, Caption, Rect, TTextFormatFlags(Flags), LColor) 
     end 
     else 
     DrawText(Handle, Caption, -1, Rect, Flags); 
    end; 
    end; 
end; 

enter image description here

+0

Muchas gracias ¡¡¡ – Salvador

+0

parece que hay una manera mucho más fácil, ver la otra respuesta –

7

En XE5, si se apaga el indicador seClient en la propiedad StyleElements, entonces la propiedad del color vuelve a funcionar como se espera.

+0

Gracias por la punta , estaba actualizando un código mío antiguo de Delphi a Berlin 10.1 Update 2 y no estaba pintando el fondo de un descendiente de control TPanel que estaba usando –

+1

@GeorgeBirbilis: Me alegro de que te haya ayudado. La respuesta aceptada parecía excesiva. – costa

0

Sobre la base de @ respuesta, el uso de la costa:

StyleElements := StyleElements - [seClient]; 

en el constructor de la clase descendiente TPanel

o si simplemente tiene alguna TPanel (o clase descendiente) instancia que puede hacer:

with myPanel do StyleElements := StyleElements - [seClient]; 

El - [...] sintaxis se utiliza desde los StyleElements es un conjunto

Para más información sobre StyleElements lea este artículo:

Estilos de sintonización VCL para formularios y controles - http://edn.embarcadero.com/article/42812

Cuestiones relacionadas