Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Orientacion del texto (https://www.clubdelphi.com/foros/showthread.php?t=11878)

senpiterno 29-06-2004 03:04:00

Orientacion del texto
 
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

Cita:

Empezado por senpiterno
.... 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:

Código:

'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

Código Delphi [-]
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

Código Delphi [-]
  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:

Código Delphi [-]
 
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.


La franja horaria es GMT +2. Ahora son las 23:11:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi