Delphi: TPanel и текстовый отступ - PullRequest
2 голосов
/ 02 июля 2011

enter image description here Как сделать вид как в желтом прямоугольнике.Используя TPanel + Color?Если да, то как насчет отступа текста слева?

Спасибо за помощь и советы!

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Самый простой способ - использовать TPanel.Установите ParentBackground на false, BevelOuter на bvNone, Font.Color на clWhite, Font.Style на [fsBold] и Color на нужный цвет фона.Затем просто поместите один или два пробела перед текстом в свойстве Caption, например ' This is an ordinary TPanel.'.

Снимок экрана http://privat.rejbrand.se/tpanelspaceprefix.png

Более элегантный вариант - написать собственный элемент управления,Это действительно легко.Пример:

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.
3 голосов
/ 02 июля 2011

Перетащите метку на панель с отступом (установите свойство Left> 0) и правильно установите цвет панели.

...