Autor Tema: pintar un texto con su fuente  (Leído 3050 veces)

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

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
pintar un texto con su fuente
« 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




« última modificación: Marzo 28, 2014, 01:29:25 pm por k_arlytos »
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:pintar un texto con su fuente
« Respuesta #1 en: Marzo 28, 2014, 11:16:20 pm »
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


Código: (VB) [Seleccionar]
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

k_arlytos

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +2/-4
    • Ver Perfil
Re:pintar un texto con su fuente
« Respuesta #2 en: Marzo 29, 2014, 01:14:48 am »
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
 
"Comentar el código es como limpiar el cuarto de baño; nadie quiere hacerlo, pero el resultado es siempre una experiencia más agradable para uno mismo y sus invitados"

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:pintar un texto con su fuente
« Respuesta #3 en: Marzo 29, 2014, 01:52:46 pm »
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

Código: [Seleccionar]
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
Código: [Seleccionar]
DrawText Me.hdc,  CompactedText(m_sTitulo, 300), -1, tRECT, DT_LEFT
otro error que veo, pero bueno puede que solo sea por el ejemplo

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

Código: (Vb) [Seleccionar]
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