Centrar texto en un listbox

Iniciado por karmany, 25 Agosto 2006, 21:23 PM

0 Miembros y 1 Visitante están viendo este tema.

karmany

Esta es una pregunta que llevo mucho tiempo intentando resolver y sin éxito..
A ver si alguno sabe cómo centrar texto en un listbox..

Hasta ahora lo que he hecho es utilizar la letra Courier que es proporcional y así calculo el centro sabiendo los caracteres que caben en un listbox.
A ver si a alguien se le ocurre algo mejor..
Gracias

karmany

Al final he conseguido algo que puede ser útil. El problema es que alineo el texto utilizando espacios y el problema de los espacios es que ocupan varios píxeles, dependiendo de cada letra. Por este motivo la alineación es buena pero no es perfecta, por culpa de estos píxeles de los espacios..

He intentado insertar datos al listbox utilizando sendmessage:
SendMessage(List1.hwnd, LB_ADDSTRING, 0, ByVal "dato"), pero no he conseguido ver ninguna constante de SendMessage que permita empezar a escribir en una determinada coordenada..
Si alguien tiene alguna idea más o a qué API podría echar un vistazo...(se tiene que poder hacer de alguna forma.)

Dejo mi código. Sólo hay que poner un listbox: List1 y un Label: Label1.

'*******************************************************
'*      Código para centrar texto en un listbox        *
'* Hay que añadir: 1 listbox: List1 y 1 label: Label1. *
'*                                                     *
'*              Realizado por karmany                  *
'*******************************************************


Private Sub Form_Load()
  Label1.AutoSize = True
  List1.AddItem (centrar("centro"))
  List1.AddItem (centrar("karmany"))
  List1.AddItem (centrar("oil"))
  'LTrim para recuperar el item original.
End Sub

Public Function centrar(text As String) As String

  Dim tamtexto As Integer, tamlist As Integer, tamreal As Integer
  Dim tamspc As Integer, espacios As Integer

  Label1.Font.Name = List1.Font.Name 'Nombre de la letra
  Label1.FontSize = List1.FontSize 'Tamaño de la letra
  Label1.FontBold = List1.FontBold 'Negrita
  Label1.FontItalic = List1.FontItalic 'Cursiva

  'Calcula el tamaño de un espacio:
  Label1.Caption = " "
  tamspc = Label1.Width

  'Calcula el tamaño del texto:
  Label1.Caption = text
  tamtexto = Label1.Width

  'Calcula el tamaño del listbox:
  tamlist = List1.Width

  'Calcula el tamaño que hay que poner delante del texto:
  tamreal = Int(tamlist - tamtexto) / 2

  'Calcula el número de espacios que hay delante del texto:
  espacios = Int(tamreal / tamspc) - 1

  centrar = Space(espacios) & text

End Function

karmany

#2
Después de comerme bastante la cabeza he hecho por fín un código que alinea texto en un listbox.
Estoy dando los últimos retoques. Lo subiré también a la Web de elGuille.
Terminado por fín--

El código completo está bien explicado en la web de elGuille:

http://www.elguille.info/colabora/vb2006/karmany_centrartextolistbox.htm

He estado también intentando hacer lo mismo de alguna forma más sencilla(y que fuera perfectamente precisa), pero no he conseguido hacer funcionar nada más.
Pienso que con estos dos ejemplos que he puesto ya no tiene que haber ningún problema.

Lo único es que si pones un título, no lo pongas en sus propiedades centrado(ej. un textbox o label centrado), ya que como también he dicho, a veces el ancho del listbox no se puede calcular correctamente y se verá el título desplazado. Y eso queda muy poco estético.
El título hay que tratarlo como un ítem más, así devolverá un valor que después habrá que transformar a scalemode del form y por último hay que pensar en la distancia que hay entre la izquierda del form y la izquierda del list que en definitiva es el Left del List.
Bueno si tienes alguna duda respecto a esto, házmelo saber y te lo explico.