启用 VCL 样式后,我需要更改 TPanel 的颜色。我尝试使用和修改文章使用启用 VCL 样式更改编辑控件的颜色中列出的代码,但它不适用于 TPanel。如何在启用 VCL 样式的情况下更改 TPanel 的颜色?
问问题
13948 次
3 回答
21
TPanel
不使用样式挂钩来绘制控件,因此您不能使用文章中描述的技术。相反,您必须覆盖该paint
方法。
使用插入器类检查此示例。
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;
于 2012-04-25T04:45:47.140 回答
19
在 XE5 中,如果您关闭 StyleElements 属性中的 seClient 标志,则 Color 属性会再次按预期工作。
于 2014-04-02T23:41:22.913 回答
4
根据@costa 的回答,使用:
StyleElements := StyleElements - [seClient];
在您的 TPanel 后代类的构造函数中
或者,如果您只有一些 TPanel(或后代类)实例,您可以这样做:
with myPanel do StyleElements := StyleElements - [seClient];
使用 -[...] 语法,因为 StyleElements 是一个集合
有关 StyleElements 的更多信息,请阅读本文:
为表单和控件调整 VCL 样式 - http://edn.embarcadero.com/article/42812
于 2017-01-12T00:32:53.817 回答