Wednesday, 1 July 2009

Mostrar el texto en la orientación que queramos en un TCanvas

Aquí os dejo el código fuente que utilicé para voltear un texto en un TCanvas, concretamente dentro de un TImage, pero puede utilizarse en cualquier componente que disponga de TCanvas. La idea consiste en utilizar las propiedades de Windows para crear una fuente en la dirección que queremos y luego volcarla en el canvas. Ya vereis que es bastante sencillo de utilizar y nos sirve para mostrar el texto en diferentes ángulos.

función:




procedure DrawTextOrientation(canvas: TCanvas; position: TPoint; epsilon: integer; font: TFont; text: string);
function iif(condition: boolean; resultTrue: integer; resultFalse: integer): integer;
begin
result := resultFalse;
if Condition then result := resultTrue
end;
var
newFont, FontSelected: integer;
begin
if text = '' then
exit;
SetBkMode(canvas.handle, transparent);
newFont := CreateFont(
-font.Size,
0,
epsilon * 10,
0,
iif(fsBold in font.Style, FW_BOLD, FW_NORMAL),
iif(fsItalic in font.Style, 1, 0),
iif(fsUnderline in font.Style, 1, 0),
iif(fsStrikeOut in font.Style, 1, 0),
ANSI_CHARSET,
OUT_TT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
FF_DONTCARE,
PChar(font.Name));

FontSelected := SelectObject(canvas.handle, newFont);
TextOut(canvas.handle, position.x, position.y, PChar(text), length(text));
SelectObject(canvas.handle, FontSelected);
DeleteObject(newFont);
end;




funcionamiento del método:




procedure TForm3.Button1Click(Sender: TObject);
var
ft: TFont;
begin
try
ft := TFont.Create;
ft.Name := 'Arial';
ft.Size := 12;
ft.Style := ft.Style + [fsBold, fsItalic, fsUnderline, fsStrikeOut];
DrawTextOrientation(image1.canvas, Point(40, 40), 0, ft, 'This is a vertical text');
ft.Style := ft.Style - [fsBold, fsItalic, fsUnderline, fsStrikeOut];
DrawTextOrientation(image1.canvas, Point(90, 110), 0, ft, 'test');
DrawTextOrientation(image1.canvas, Point(80, 100), 45, ft, 'test');
DrawTextOrientation(image1.canvas, Point(75, 95), 90, ft, 'test');
DrawTextOrientation(image1.canvas, Point(65, 110), 135, ft, 'test');
DrawTextOrientation(image1.canvas, Point(70, 125), 180, ft, 'test');
DrawTextOrientation(image1.canvas, Point(80, 135), 235, ft, 'test');
DrawTextOrientation(image1.canvas, Point(90, 135), 270, ft, 'test');
DrawTextOrientation(image1.canvas, Point(97, 125), 315, ft, 'test');
finally
FreeAndNil(ft);
end;
end;





Aquí os dejo el resultado de la llamada al ejemplo:

  • Enlaces de interés:
Programación en Windows.
Vertical TitleBar.

0 comments:

Post a Comment