[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]