| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Jue 06 May, 2010 5:21 pm Asunto: Texto vertical en un TLabel |
|
|
| Hay alguna manera de que un TLabel muestre el texto de forma vertical ya busque en el foro y solo encontre como escribir texto en pantalla de forma vertical pero solo funciona con componentes con opcion OnDraw |
|
| Volver arriba |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Jue 06 May, 2010 6:17 pm Asunto: |
|
|
Yo tengo guardado este codigo en Delphi.
No lo veo muy complicado de traducir
Lo que hace es escribir en el Canvas del formulario, no necesita ningun TLabel.
Para probarlo, te creas un formulario y le añades un boton, nada más.
| Código: |
procedure TForm1.Button1Click(Sender: TObject);
var
lf : TLogFont;
tf : TFont;
begin
with Form1.Canvas do begin
Font.Name := 'Arial';
Font.Size := 24;
tf := TFont.Create;
try
tf.Assign(Font);
GetObject(tf.Handle, sizeof(lf), @lf);
lf.lfEscapement := 450;
lf.lfOrientation := 450;
tf.Handle := CreateFontIndirect(lf);
Font.Assign(tf);
finally
tf.Free;
end;
TextOut(20, Height div 2, 'Rotated Text!');
end;
end;
end.
|
Espero que te sirva!! |
|
| Volver arriba |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Jue 06 May, 2010 6:29 pm Asunto: |
|
|
Por pura curiosidad he buscado en Google, y he encontrado esto en C++
| Código: |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HFONT hFont = CreateFont(24, 20, (10*45), (10*45),
FW_THIN, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
FF_DONTCARE, "Georgia");
Canvas->Font->Handle = hFont;
Canvas->TextOut(100, 325, "Ferdinand Oyono");
}
|
Mas informacion:
http://www.functionx.com/bcb/howto/font.htm |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 06 May, 2010 6:52 pm Asunto: |
|
|
El problema de pintar directamente en el Canvas es que tenemos que refrescarlo o se borra. Se puede apañar un TLabel de esta manera:
| Código: | VerticalizaLabel(TLabel* Label)
{
Label->Alignment = taCenter;
Label->AutoSize = false;
Label->WordWrap = true;
int L = Label->Caption.Length();
char* T = new char[L*2];
int i;
for(i=0; i<L; i+=2){
T[i] = (Label->Caption.c_str())[i/2];
T[i+1] = ' ';
}
T[i-1] = 0;
Label->Caption = String(T);
delete [] T;
Label->Width = Label->Canvas->TextWidth("O");
Label->Height = Label->Canvas->TextHeight("O")*Label->Caption.Length();
}
|
Saludos. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 06 May, 2010 11:16 pm Asunto: |
|
|
Como añadido... las últimas versiones de C++Builder la clase TFont tiene la propiedad "Orientation". Por ejemplo para pintar un texto vertical en el Form, ponemos lo siguiente en el evento OnPaint del mismo:
Canvas->Font->Orientation = 900;
Canvas->TextOut(0, 100, "Esto es una prueba");
O podemos usar el componente TPaintBox que es un poco más comodo para situar las cosas que queremos dibujar.. y en su evento OnPaint:
PaintBox1->Canvas->Font->Orientation = 900;
PaintBox1->Canvas->TextOut(0, 100, "Esto es una prueba"); |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 07 May, 2010 3:21 am Asunto: |
|
|
Gracias a todos por su respuesta...
La respuesta de escafandra me gusta... ya que tengo que colocar el texto sobre una TImage
Pero no funciona muy bien el texto sale incompleto a la ora de mostrarlo
Ejemplo "LABEL1", y lo muestra
L
A
B
y pues mis conocimientos en programacion no me permiten modficar el codigo que me otorga escafandra si alguien me pudiera orientar un poco mas en el codigo lo agradeceria mucho |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 07 May, 2010 3:54 am Asunto: |
|
|
Otra opción, similar a la de escafandra:
| Código: | void VerticalizaLabel(TLabel* Label)
{
Label->Alignment = taCenter;
int len = Label->Caption.Length();
for (int i = 2; i <= len; i++)
Label->Caption = Label->Caption.Insert("\r", (i-1)*2);
} |
| vizca321 escribió: | | ya que tengo que colocar el texto sobre una TImage |
Por cierto, la opción de usar un TPaintBox con el texto rotado también funciona sobre un TImage. |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 07 May, 2010 6:10 am Asunto: |
|
|
| Gracias por la respuesta Leo y el TPaintBox pense que era de versiones mas nuevas por eso no lo busque antes gracias de todas formas con la funcion que muestras funciona de maravilla creo que eso es todo gracias a por cierto a este codigo si le entiendo y lo puedo modificar a mi gusto gracias nuevamente |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 07 May, 2010 6:14 am Asunto: |
|
|
| ¿ Que versión utilizas ? |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 07 May, 2010 6:17 am Asunto: |
|
|
| _Leo escribió: | | ¿ Que versión utilizas ? |
Version 6
Y si esta el TPaintBox
Pero me da un error
| Código: | PaintBox1->Canvas->Font->Orientation = 900;
PaintBox1->Canvas->TextOut(0, 100, "Esto es una prueba"); |
Que dice orientacion no es miembro de Font |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 07 May, 2010 6:44 am Asunto: |
|
|
OK, en la versión 6 y anteriores no existe esa propiedad. Pero podemos adaptar la versión que te ponía más arriba rockman2003..
Sustituye esas dos líneas en el "OnPaint" del "TPaintBox" por esto:
| Código: | TCanvas* canvas = static_cast<TPaintBox*>(Sender)->Canvas;
LOGFONT lf;
GetObject(canvas->Font->Handle, sizeof(lf), &lf);
lf.lfOrientation = lf.lfEscapement = 90 * 10;
HFONT oldFont = SelectObject(canvas->Handle, CreateFontIndirect(&lf));
SetBkMode(canvas->Handle, TRANSPARENT); // Fondo transparente
PaintBox1->Canvas->TextOut(0, 100, "Esto es una prueba");
DeleteObject(SelectObject(canvas->Handle, oldFont));
|
El resto de atributos de la fuente (tamaño, color, etc.) los puedes cambiar en la propiedad Font del TPaintBox.
(Probado en las versiones 1, 4 y 6) |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 07 May, 2010 6:41 pm Asunto: |
|
|
| Ya inserte el codigo en el OnPaint del TPaintBox pero sigue escribiendolo de forma horisontal |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 07 May, 2010 6:59 pm Asunto: |
|
|
| vizca321 escribió: | | Ya inserte el codigo en el OnPaint del TPaintBox pero sigue escribiendolo de forma horisontal |
¿ Que fuente estas utilizando ? Solo las fuentes vectoriales (TTF/OTF) se pueden rotar (por ejemplo Arial..) |
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 07 May, 2010 7:08 pm Asunto: |
|
|
| O sierto usaba la fuente que esta por default funciona bien |
|
| Volver arriba |
|
 |
|