PDA

Ver la Versión Completa : Orientacion del texto


senpiterno
29-06-2004, 03:04:00
Hola amigos

Me gustaria saber si es posible utilizando el canvas de un objeto, escribir texto en forma vertical, pero no de esta forma:
t
e
x
t
o

sino, como si tomaramos un texto escrito en forma normal (horizontal) y lo levantaramos 90 grados hacia la izquierda. En VB logre hacerlo utilizando la API de win, pero ahora me gustaria hacerlo en delphi.

Gracias de antemano por cualquier ayuda.

vic_ia
29-06-2004, 03:27:49
.... En VB logre hacerlo utilizando la API de win, pero ahora me gustaria hacerlo en delphi.

Hola, si lo lograste hacer con la API de Win en VB, pues no tienes mas que utilizar esas mismas funciones desde delphi, no debiera tener mayor problema, si algo te presenta problemas puedes publicar el codigo en VB y vemos si te podemos ayudar a implementarlo en delphi...

saludos....

senpiterno
29-06-2004, 03:44:38
vic_ia, aqui esta el codigo en VB:


'Declaracion de tipo

Public Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 33
End Type

'Funciones de la api win

Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long

Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long


'Procedure que crea el texto vertical

Public Sub StringVertical(ByVal Titulo As String, picMain As PictureBox)

On Error GoTo GetOut
Dim f As LOGFONT
Dim hPrevFont As Long
Dim hFont As Long
Dim FontName As String
Dim FONTSIZE As Integer

FONTSIZE = 10

f.lfEscapement = 10 * 90
FontName = "Tahoma" + Chr$(0) 'caracter nulo
f.lfFaceName = FontName
f.lfHeight = (FONTSIZE * -20) / Screen.TwipsPerPixelY
hFont = CreateFontIndirect(f)
hPrevFont = SelectObject(picMain.hdc, hFont)

picMain.CurrentX = 3

picMain.CurrentY = picMain.Height - 10
picMain.Print Titulo

' Restauramos el estado original
hFont = SelectObject(picMain.hdc, hPrevFont)
DeleteObject hFont

Exit Sub
GetOut:
Exit Sub
End Sub




Espero lo entindas...Saludos.

senpiterno
29-06-2004, 03:47:49
Se me olvidava, intente migrar el codigo de VB a Delphi, pero no dio ningun resultado, reeplace el PictureBox por un TPaintBox, pero como te digo no dio ningun resultado....

vic_ia
29-06-2004, 23:34:50
procedure TForm1.Button1Click(Sender: TObject);
var
LOGFONT : TLogFont;
Font : HFONT;
begin
LOGFONT.lfHeight := 30;
LOGFONT.lfWidth := 10;
LOGFONT.lfWeight := FW_NORMAL;
LOGFONT.lfEscapement := 900; { angulo expresado en decimas de grado }
LOGFONT.lfStrikeOut := 0; { distinto de cero para activarlo }
LOGFONT.lfItalic := 0; { distinto de cero para activarlo }
LOGFONT.lfUnderline := 0; { distinto de cero para activarlo }
LOGFONT.lfFaceName := 'Tahoma';

Font := CreateFontIndirect(LOGFONT);

SelectObject(Form1.Canvas.Handle,Font);
Form1.Canvas.TextOut(100,100,Edit1.Text);
DeleteObject(Font);
end;


si te fijas, no necesitas redefinir ni los tipos ni las funciones del API, puesto que eso ya lo ha hecho delphi...

obviamente al igual que como tu, no he asignado todas las propiedades del LOGFONT...

por simplicidad pongo el texto en el canvas del form pero le puedes hacer en el canvas del control que te sea mas adecuado....

espero te sea de utilidad....

saludos....

senpiterno
30-06-2004, 19:57:23
Lamento decirte amigo vic_ia que el metodo que me indicaste solo funciona en el canvas de un Form, pero no en otros objetos como PaintBox, Image Shape....

Lo he provado varias veces y como te menciono solo funciona en el canvas del form. El problema es que yo necesito realizarlo sobre un objeto de los que te mencione anteriormente...

Quizas tengas la respuesta de ¿porque solo funciona en el canvas del form?.

saludos..

vic_ia
30-06-2004, 20:09:53
hola...

pues yo he probado con un Paintbox sustituyendo las lineas correspondientes y me funciona sin ningun problema

SelectObject(PaintBox.Canvas.Handle,Font);
PaintBox.Canvas.TextOut(100,100,Edit1.Text);

saludos...

senpiterno
30-06-2004, 21:29:14
Tienes razon amigo vic_ia, si funciona con el canvas de otros objetos, el problema del porque no se mostraba el texto en pantalla esta en la siguiente linea:



PaintBox1.Canvas.TextOut(x,y,'Hola');



"x" e "y", no tenian valores apropiados respecto al tamaño del Paintbox que estaba utilizando....pero el problema ya esta solucionado...
Muchas gracias amigo vic_ia, de verdad me has servido de mucha ayuda..

Gracias y saludos.