Reputation: 4315
How can I make the view like in the Yellow rectangle. Using TPanel + Color? If yes what about an indent of the text from the left?
Thanks for help and advices!
Upvotes: 1
Views: 3321
Reputation: 109003
The simplest way is to use a TPanel
. Set ParentBackground
to false
, BevelOuter
to bvNone
, Font.Color
to clWhite
, Font.Style
to [fsBold]
and the Color
to the background colour you want. Then simply put one or two spaces in front of your text in the Caption
property, like ' This is an ordinary TPanel.'
.
A more elegant soution is to write a custom control. This is really easy. Example:
unit CaptionBar;
interface
uses
Windows, SysUtils, Classes, Controls, Graphics;
type
TCaptionBar = class(TCustomControl)
private
FColor: TColor;
FCaption: TCaption;
FEllipsis: boolean;
FIndent: integer;
procedure SetCaption(const Value: TCaption);
procedure SetColor(const Value: TColor);
procedure SetEllipsis(const Value: boolean);
procedure SetIndent(const Value: integer);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
published
property Font;
property Anchors;
property Align;
property Caption: TCaption read FCaption write SetCaption;
property Color: TColor read FColor write SetColor default clSkyBlue;
property Ellipsis: boolean read FEllipsis write SetEllipsis default true;
property Indent: integer read FIndent write SetIndent default 4;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Rejbrand 2009', [TCaptionBar]);
end;
{ TCaptionBar }
constructor TCaptionBar.Create(AOwner: TComponent);
begin
inherited;
FIndent := 4;
FColor := clSkyBlue;
FEllipsis := true;
end;
procedure TCaptionBar.Paint;
const
Ellipsis: array[boolean] of cardinal = (0, DT_END_ELLIPSIS);
var
r: TRect;
begin
inherited;
Canvas.Brush.Color := FColor;
Canvas.FillRect(ClientRect);
r := ClientRect;
r.Left := r.Left + FIndent;
Canvas.Font.Assign(Font);
DrawText(Canvas.Handle,
PChar(FCaption),
length(FCaption),
r,
DT_SINGLELINE or DT_LEFT or DT_VCENTER or Ellipsis[FEllipsis]);
end;
procedure TCaptionBar.SetCaption(const Value: TCaption);
begin
if not SameStr(FCaption, Value) then
begin
FCaption := Value;
Invalidate;
end;
end;
procedure TCaptionBar.SetColor(const Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
Invalidate;
end;
end;
procedure TCaptionBar.SetEllipsis(const Value: boolean);
begin
if FEllipsis <> Value then
begin
FEllipsis := Value;
Invalidate;
end;
end;
procedure TCaptionBar.SetIndent(const Value: integer);
begin
if FIndent <> Value then
begin
FIndent := Value;
Invalidate;
end;
end;
end.
Upvotes: 4
Reputation: 69022
Drop a Label into the panel, indented (set the Left property > 0) and set the panel color correctly.
Upvotes: 3