Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: k_arlytos en Marzo 28, 2014, 01:21:44 pm
-
tengo entendido que con la api
DrawText --> pintar un texto
SetRect --> fijar el ancho, alto, arriba y abajo DEL TEXTO
con estas dos apis se puede pintar un texto pero siempre eh visto textos de esta forma(DE FORMA CONTINUA)
EJEMPLO:
"ESTE ES UN TEXTO DE PRUEBA"
pero lo que yo quisiera es que tuviera un salto de linea si llego al ancho correspondiente
"ESTE ES UN TEXTO DE
PRUEBA CON UN
ANCHO DE PRUEBA"
pero con una fuente distinta
esto es lo que yo hago para pintar DOS textos
UserControl.font = "Segoe UI Symbol"
UserControl.FontSize = 9
UserControl.FontBold = True
UserControl.ForeColor = &H8000000D
Dim TextRect As RECT
SetRect TextRect, 55, 5, 360, 50
DrawText UserControl.hdc, CompactedText(m_sTitulo, 300), Len(m_sTitulo), TextRect, DT_LEFT
'pero la fuente se repite para los dos textos, como hago para que cada fuente sea independiente de cada texto
'y que en el segundo m_sDescripcion que tuviese un salto de linea por que aqui el texto es grande
UserControl.font = "Arial"
UserControl.FontSize = 6
UserControl.FontBold = False
UserControl.ForeColor = &H00FFFFFF
Dim TextRect As RECT
SetRect TextRect, 55, 50, 360, 50
DrawText UserControl.hdc, CompactedText(m_sDescripcion, 300), Len(m_sDescripcion), TextRect, DT_LEFT
-
Hola, no se si entendí bien, pero si vos queres dibujar un texto multilinea tenes que agregar la constante DT_WORDBREAK.
abajo te puse un listado de constante para utilizar con DrawText, conviando algunas de estas constantes podes lograr muchos efectos como centrar verticalmente, horizontalmente, agretar los ... cuando el texto es mayor al rectangulo asignado, calcular el rectangulo que ocupara el texto a dibujar etc etc. mejor mirate en la MSDN la descripcion para cada constante, tene en cuenta que algunas no las podes combinar, pero podes ir jugando y vas a encontrar muchas combinaciones
http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx
Option Explicit
'http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx
Private Const DT_BOTTOM As Long = &H8
Private Const DT_CALCRECT As Long = &H400
Private Const DT_CENTER As Long = &H1
Private Const DT_EDITCONTROL As Long = &H2000
Private Const DT_END_ELLIPSIS As Long = &H8000
Private Const DT_EXPANDTABS As Long = &H40
Private Const DT_EXTERNALLEADING As Long = &H200
Private Const DT_HIDEPREFIX As Long = &H100000
Private Const DT_INTERNAL As Long = &H1000
Private Const DT_LEFT As Long = &H0
Private Const DT_MODIFYSTRING As Long = &H10000
Private Const DT_NOCLIP As Long = &H100
Private Const DT_NOFULLWIDTHCHARBREAK As Long = &H80000
Private Const DT_NOPREFIX As Long = &H800
Private Const DT_PATH_ELLIPSIS As Long = &H4000
Private Const DT_PREFIXONLY As Long = &H200000
Private Const DT_RIGHT As Long = &H2
Private Const DT_RTLREADING As Long = &H20000
Private Const DT_SINGLELINE As Long = &H20
Private Const DT_TABSTOP As Long = &H80
Private Const DT_TOP As Long = &H0
Private Const DT_VCENTER As Long = &H4
Private Const DT_WORDBREAK As Long = &H10
Private Const DT_WORD_ELLIPSIS As Long = &H40000
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function DrawText Lib "user32.dll" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, ByRef lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function SetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Sub Form_Load()
Dim tRECT As RECT
Dim sText As String
Me.AutoRedraw = True
Me.ScaleMode = vbPixels
sText = "Hola " & vbCrLf & "Mundo"
SetRect tRECT, 0, 0, Me.ScaleWidth, Me.ScaleHeight
DrawText Me.hdc, sText, Len(sText), tRECT, DT_WORDBREAK Or DT_LEFT
sText = "Texto " & vbCrLf & "Centrado"
DrawText Me.hdc, sText, Len(sText), tRECT, DT_WORDBREAK Or DT_CENTER Or DT_VCENTER
End Sub
-
muchas gracias leandro, pero con respecto a las fuentes?
lo que deseo es pintar dos textos en posiciones diferentes y con fuentes diferentes
yo lo hago de esta manera
'PRIMER TEXTO CON FUENTE DISTINTA
UserControl.font = "Segoe UI Symbol"
UserControl.FontSize = 9
UserControl.FontBold = True
UserControl.ForeColor = &H8000000D
Dim TextRect As RECT
SetRect TextRect, 55, 5, 360, 50
DrawText UserControl.hdc, CompactedText(m_sTitulo, 300), Len(m_sTitulo), TextRect, DT_LEFT
'SEGUNDO TEXTO CON FUENTE DISTINTA
UserControl.font = "Arial"
UserControl.FontSize = 6
UserControl.FontBold = False
UserControl.ForeColor = &H00FFFFFF
Dim TextRect As RECT
SetRect TextRect, 55, 50, 360, 50
DrawText UserControl.hdc, CompactedText(m_sDescripcion, 300), Len(m_sDescripcion), TextRect, DT_LEFT
PERO LA FUENTE NO CAMBIA.... NO ES INDEPENDIENTE DE CADA TEXTO LOS DOS TEXTOS SON O Segoe UI Symbol O Arial
PERO LO QUE DESEO ES QUE EN CADA TEXTO SEAN DIFERENTES FUENTES
-
Seguramente estas haciendo algo mal, porque si tiene que cambiar, pregunta que es lo que hace la funcion CompactedText()??? , creo que hay tienes tu problema.
hay veo un error ya que pasas mas caracteres de lo que seguramente esa funcion devolvera, es un detalle tonto pero para que lo tengas en cuenta
Len(CompactedText(m_sTitulo, 300) ) = 50
Len(m_sTitulo) = 100
siempre es mejor almacenar el resultado de CompactedText() en una variable para luego
sText = CompactedText(m_sTitulo, 300)
DrawText Me.hdc, sText, Len(sText), tRECT, DT_LEFT
en el ultimo de los casos pasas -1 al parametro nCount
DrawText Me.hdc, CompactedText(m_sTitulo, 300), -1, tRECT, DT_LEFT
otro error que veo, pero bueno puede que solo sea por el ejemplo
SetRect TextRect, 55, 50, 360, 50esas medias están mal, ya que la "Top" es igual al "Bottom" en todo caso debería ser 50+ 50, asi seria que el rectangulo tiene 50 de alto, como vos lo pusite tiene 0 de alto.
Option Explicit
'http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx
Private Const DT_BOTTOM As Long = &H8
Private Const DT_CALCRECT As Long = &H400
Private Const DT_CENTER As Long = &H1
Private Const DT_EDITCONTROL As Long = &H2000
Private Const DT_END_ELLIPSIS As Long = &H8000
Private Const DT_EXPANDTABS As Long = &H40
Private Const DT_EXTERNALLEADING As Long = &H200
Private Const DT_HIDEPREFIX As Long = &H100000
Private Const DT_INTERNAL As Long = &H1000
Private Const DT_LEFT As Long = &H0
Private Const DT_MODIFYSTRING As Long = &H10000
Private Const DT_NOCLIP As Long = &H100
Private Const DT_NOFULLWIDTHCHARBREAK As Long = &H80000
Private Const DT_NOPREFIX As Long = &H800
Private Const DT_PATH_ELLIPSIS As Long = &H4000
Private Const DT_PREFIXONLY As Long = &H200000
Private Const DT_RIGHT As Long = &H2
Private Const DT_RTLREADING As Long = &H20000
Private Const DT_SINGLELINE As Long = &H20
Private Const DT_TABSTOP As Long = &H80
Private Const DT_TOP As Long = &H0
Private Const DT_VCENTER As Long = &H4
Private Const DT_WORDBREAK As Long = &H10
Private Const DT_WORD_ELLIPSIS As Long = &H40000
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function DrawText Lib "user32.dll" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, ByRef lpRect As RECT, ByVal wFormat As Long) As Long
Private Declare Function SetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Sub Form_Load()
Dim tRECT As RECT
Dim sText As String
Me.AutoRedraw = True
Me.ScaleMode = vbPixels
sText = "Hola " & vbCrLf & "Mundo"
'PRIMER TEXTO CON FUENTE DISTINTA
Me.Font = "Segoe UI Symbol"
Me.FontSize = 9
Me.FontBold = True
Me.ForeColor = &H8000000D
SetRect tRECT, 55, 5, 360, 50
DrawText Me.hdc, sText, -1, tRECT, DT_LEFT
'SEGUNDO TEXTO CON FUENTE DISTINTA
Me.Font = "Arial"
Me.FontSize = 6
Me.FontBold = False
Me.ForeColor = &HFFFFFF
SetRect tRECT, 55, 50, 360, 100
DrawText Me.hdc, sText, Len(sText), tRECT, DT_LEFT
End Sub