Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Texto vertical en un TLabel

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Texto vertical en un TLabel Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

¿ Que versión utilizas ?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

_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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ya inserte el codigo en el OnPaint del TPaintBox pero sigue escribiendolo de forma horisontal
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

O sierto usaba la fuente que esta por default funciona bien
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.