Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: Pascal
Expertise: Beginner
Jun 16, 1998

Text Orientation in a Bitmap

Question:
How is it possible to write a vertical text (with TextOut procedure) in a bitmap (Delphi 2)?

Answer:
I know how to do this with a TLabel descendant, but you can probably apply the same principles to writing text to the canvas. Below is code for a component that will display text at any angle between 0 and 360 degrees. I use it a lot for creating cool effects on forms. You should concentrate on the Paint procedure. This does the actual writing and uses the TextOut function to display the angled text.

unit AngLabel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TRotation = Integer;
  TAngLabel = class(TCustomLabel)
  private
    FRotation : TRotation;
    { Private declarations }
  protected
    { Protected declarations }
    procedure Paint; override;
    procedure SetRotation(Value: TRotation); virtual;
    procedure CMFontChanged(var Message: TMessage);
      message CM_FONTCHANGED;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    { properties published by TLabel but NOT by TRotationLabel:
    Alignment, AutoSize, ShowAccelChar, WordWrap }
    { Published properties declared in TCustomLabel}
    property Align;
    property Caption;
    property Color;
    property DragCursor;
    property DragMode;
    property Enabled;
    property FocusControl;
    property Font;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Transparent;
    property Visible;
    property OnClick;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    {new properties}
    property Angle : TRotation read FRotation write SetRotation;
  end;

procedure Register;

implementation

{$R *.dcr}

procedure TAngLabel.CMFontChanged(var Message: TMessage);
VAR TTM : TTextMetric;
begin
  Inherited;
  if csLoading in ComponentState then Exit;
  Canvas.Font := Font;
  GetTextMetrics(Canvas.Handle, TTM);
  if TTM.tmPitchAndFamily AND TMPF_TRUETYPE = 0 then
    begin
      Font.Name := 'Arial';
      MessageBeep(MB_ICONSTOP);
      ShowMessage('Only TrueType fonts permittted');
    end;
end;

procedure TAngLabel.SetRotation(Value: TRotation);
begin
  if (Value <> FRotation) then
    begin
      FRotation := Value;
      Invalidate;
    end;
end;

constructor TAngLabel.Create(AOwner: TComponent);
begin
  Inherited Create(AOwner);
  ControlStyle := ControlStyle + [csOpaque];
  Width        := 65;
  Height       := 65;
  AutoSize     := False;
  Transparent  := True;
end;

procedure TAngLabel.Paint;
VAR
  TLF    : TLogFont;
  R      : TRect;
  X,Y    : Integer;
  TH, TW,           {text width and height}
  AW, AH : Integer; {width & height of rect enclosing angled label}
begin
  R := ClientRect;
  GetObject(Font.Handle, SizeOf(TLF), @TLF);
  TLF.lfEscapement := (((Angle MOD 360) + 360) MOD 360) * 10;
  with Canvas DO
    begin
      Font.Handle := CreateFontIndirect(TLF);
      with Brush DO
        if NOT Transparent then
          begin
            Style := bsSolid;
            Color := Self.Color;
          end
        ELSE Style := bsClear;
      TW := TextWidth(Caption);
      TH := TextHeight(Caption);
    end;
  AW := Round((TW * Cos(Angle*pi/180)) +
    (TH * Sin(Angle*pi/180)));
  AH := Round((TW * Cos((Angle+90)*pi/180)) +
    (TH * Sin((Angle+90)*pi/180)));
  X := (R.Right-AW) DIV 2;
  Y := (R.Bottom-AH) DIV 2;
  if not Enabled then Canvas.Font.Color := clGrayText;
  Canvas.TextOut(X, Y, Caption);
end;

procedure Register;
begin
  RegisterComponents('BD', [TAngLabel]);
end;

end.
DevX Pro
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date