[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]


Hey Gary,
I got this from Loyd's Help files...
--------------------------------------------------
unit Rotate;
{***********************************************************
PROGRAM
  UNIT ROTATE.PAS

PURPOSE
  To contain the text rotation routines. All documentation
  for the routines are within the routines.

HISTORY
  6/18/1995 First created by Curtis Keisler

COPYRIGHT & DISCLAIMER
  See ANGLE.DPR for copyright and disclaimer notice.
***********************************************************}

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    procedure PaintBox1Paint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{**********************************************************}
procedure CanvasSetTextAngle(c: TCanvas; d: Word);

{-----------------------------------------------------------
  PURPOSE
    To change the current text output rotation angle. All
    subsequent output will be at the angle provided.

  INPUT PARAMETERS
    c - The canvas on which to output the text. The font for
      the canvas must be a scaleable font.
    d - The angle in tenths of degrees. For example 10 would
      be 1 degree. 450 would be 45 degrees. 1 would be
      1/10 of a degree. To reset the text back to normal,

      make d = 0.

  HISTORY
    6/18/1995 First version written by Curtis Keisler.
-----------------------------------------------------------}
var
  LogRec: TLOGFONT;     {* Storage area for font information *}

begin
  {* Get the current font information. We only want to modify the angle *}
  GetObject(c.Font.Handle,SizeOf(LogRec),Addr(LogRec));

  {* Modify the angle. "The angle, in tenths of a degrees, between the base
     line of a character and the x-axis." (Windows API Help file.)*}

  LogRec.lfEscapement := d;

  {* Delphi will handle the deallocation of the old font handle and *}
  c.Font.Handle := CreateFontIndirect(LogRec);
end; {* CanvasSetTextAngle *}

{**********************************************************}
procedure CanvasTextOutAngle(c: TCanvas; x,y: Integer; d: Word; s: string);
{-----------------------------------------------------------
  PURPOSE
    To output rotated text in the same font as the font on
    the supplied canvas. The font must also be a scaleable

    font.

  INPUT PARAMETERS
    c - The canvas on which to output the text. The font for
      the canvas must be a scaleable font.
    x,y - The x,y screen coordinates you would normally
      supply the TextOut procedure.
    d - The angle in tenths of degrees. For example 10 would
      be 1 degree. 450 would be 45 degrees. 1 would be
      1/10 of a degree.
    s - The text to be output to the canvas.
  HISTORY
    6/18/1995 First version written by Curtis Keisler.

-----------------------------------------------------------}
var
  LogRec: TLOGFONT;     {* Storage area for font information *}
  OldFontHandle,        {* The old font handle *}
  NewFontHandle: HFONT; {* Temporary font handle *}

begin
  {* Get the current font information. We only want to modify the angle *}
  GetObject(c.Font.Handle, SizeOf(LogRec), Addr(LogRec));

  {* Modify the angle. "The angle, in tenths of a degrees, between the base
     line of a character and the x-axis." (Windows API Help file.)*}

  LogRec.lfEscapement := d;

  {* Create a new font handle using the modified old font handle *}
  NewFontHandle := CreateFontIndirect(LogRec);

  {* Save the old font handle! We have to put it back when we are done! *}
  OldFontHandle := SelectObject(c.Handle,NewFontHandle);

  {* Finally. Output the text! *}
  c.TextOut(x,y,s);

  {* Put the font back the way we found it! *}
  NewFontHandle := SelectObject(c.Handle,OldFontHandle);

  {* Delete the temporary (NewFontHandle) that we created *}

  DeleteObject(NewFontHandle);

end; {* CanvasTextOutAngle *}

procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  degree,i,           {* Iteration variables *}
  midX,midY: integer; {* The middle of the form *}
  deg2Rad: Real;      {* Used to convert the degrees to radians *}

begin
  {* Used to convert the degrees to radians *}
  deg2Rad := PI / 180;

  {* Choose a scalable font! *}
  PaintBox1.Font.Name := 'Arial';
  PaintBox1.Font.Size := 12;

  {* Compute the center of the screen *}

  midX := PaintBox1.Width div 2;
  midY := PaintBox1.Height div 2;

  {* Draw 16 different angles *}
  for i := 0 to 15 do begin
    {* Compute each angle. i * (360 / 16) *}
    degree := round(i * 22.5);

    {*
       Draw the from the edges of a circle with radius of 50 pixels.
       I use -y because y is the opposite direction of the normal
       cartesian coordinate system that the sin() function is based
       upon.
       Multiply degree by 10 because the function wants 10ths of a

       degree.
    *}
    CanvasTextOutAngle(PaintBox1.Canvas,
                              round(midX + 50 * cos(degree * deg2Rad)),
                              round(midY - 50 * sin(degree * deg2Rad)),
                              degree*10,
                              'abcd');
  end; {* Next angel (i) *}

  {* Set the subsequent angle to 45 degrees (or 45 * 10 tenths = 450 *}
  CanvasSetTextAngle(PaintBox1.Canvas,450); {* 45 degrees *}

  {* Output text *}

  PaintBox1.Canvas.TextOut(10,100,'45 degrees');
  PaintBox1.Canvas.TextOut(40,100,'To the right 30 pixels');

  {* Set it back *}
  CanvasSetTextAngle(PaintBox1.Canvas,0);

end;

end.

{ This code came from Lloyd's help file! }

[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]