Necesito cambiar el color de un TPanel cuando los estilos de VCL están habilitados. Intenté usar y modificar el código enumerado en el artículo Changing the color of Edit Controls with VCL Styles Enabled, pero no está funcionando para un TPanel. ¿Cómo puedo cambiar el color de un TPanel con los estilos de VCL habilitados?¿Cómo puedo cambiar el color de un TPanel con los estilos de VCL habilitados?
Respuesta
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;
En XE5, si se apaga el indicador seClient en la propiedad StyleElements, entonces la propiedad del color vuelve a funcionar como se espera.
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 –
@GeorgeBirbilis: Me alegro de que te haya ayudado. La respuesta aceptada parecía excesiva. – costa
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
- 1. combobox no utiliza color de resaltado de estilo vcl.
- 2. TabRenderer sin estilos visuales habilitados?
- 3. ¿Cómo puedo peinar el cuadro de mensaje de mi aplicación cuando los estilos vcl están activados?
- 4. Tutorial de estilos de Delphi VCL: cómo cambiar el estilo en el tiempo de ejecución
- 5. Estilos Delphi XE2 VCL, actualización de los subtítulos bloquea la invalidación de otros controles
- 6. ¿Por qué la propiedad de color de TPanel muestra un color incorrecto cuando se usa un valor de color hexadecimal?
- 7. Cambiar el color de todos los píxeles con otro color
- 8. Delphi XE2, cómo mantener la forma ENCIMA después de cambiar estilos VCL
- 9. Usar Javascript para cambiar los estilos de visualización (CSS) sin afectar a los estilos de impresión
- 10. ¿Cómo puedo cambiar el color de un UITExtField clearButton?
- 11. ¿Cómo puedo aplicar un estilo vcl a TPopupmenu?
- 12. cómo cambiar el color de un QGraphicsTextItem
- 13. ¿Cómo puedo cambiar el color del texto con jQuery?
- 14. Cambiar los estilos predeterminados de Github
- 15. ¿cómo puedo cambiar la parte de color de un TextView?
- 16. ¿Cómo puedo cambiar un color de fuente específico en git?
- 17. ¿Cómo puedo cambiar el color de invisibles en Xcode4?
- 18. ¿Cómo puedo cambiar el color del título de UIButton?
- 19. Problemas con los estilos de OpenLayers
- 20. TDateTimePicker Estilos de VCL en XE2 que solo ocurre en el tema clásico de Windows
- 21. ¿Cómo cambiar el color JProgressBar?
- 22. ¿Cómo cambiar el color de los caracteres particulares en JLabel?
- 23. ¿Cómo puedo cambiar el color de una imagen en Silverlight/WP7 (máscara de color)?
- 24. xterm: cómo cambiar el color de fondo?
- 25. ¿Cómo detectar cuando el mouse se aleja de un TPanel en Delphi 6?
- 26. ¿Puedo cambiar el color de fondo de la consola Firebug?
- 27. Cómo cambiar el color de HUD lugar del color gris
- 28. ¿Cómo puedo desactivar estilos de CSS heredados?
- 29. ¿Es posible cambiar los estilos de Google Map después de que se haya inicializado el mapa?
- 30. ¿Cómo puedo cambiar el color del texto en IFrame
Muchas gracias ¡¡¡ – Salvador
parece que hay una manera mucho más fácil, ver la otra respuesta –