Visual Basic.NET - Texto Vertical en un control button

 
Vista:
sin imagen de perfil

Texto Vertical en un control button

Publicado por Adriano (21 intervenciones) el 12/07/2017 11:23:29
Hola a todos:

He encontrado este código para rotar el texto de un control button 90º.

¿Cómo puedo modificarlo para que rote el texto 270º?

Gracias por la ayuda


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Class VerticalButton
 
    Inherits Button
    Public Property VerticalText As String
    Private Fmt As New StringFormat
    Public Sub New()
        Fmt.Alignment = StringAlignment.Center
        Fmt.LineAlignment = StringAlignment.Center
    End Sub
 
Protected Overrides Sub OnPaint(ByVal pevent As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(pevent)
        pevent.Graphics.TranslateTransform(Width, 0)
        pevent.Graphics.RotateTransform(90)
        pevent.Graphics.DrawString(_VerticalText, Font, Brushes.Black, New Rectangle(0, 0, Height, Width), Fmt)
    End Sub
 
End Class
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Evan Hailey
Val: 55
Ha aumentado su posición en 3 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Texto Vertical en un control button

Publicado por Evan Hailey (51 intervenciones) el 13/07/2017 15:33:37
Saludos, yo uso una cosa así cuando necesito que el texto sea en vertical...

1
2
3
4
5
6
7
8
9
10
Dim MiPincel As System.Drawing.SolidBrush = New SolidBrush(Color.Gray)
Dim Formato As System.Drawing.StringFormat = New StringFormat(StringFormatFlags.DirectionVertical) '  <- Aquí la magia!!!!
 
Dim Fuente As System.Drawing.Font = New Font("Arial", 9, FontStyle.Regular)
Me.PictureBox1.CreateGraphics.Clear(Color.White)
Me.PictureBox1.CreateGraphics.DrawString("Esta es una prueba de mi texto vertical!", Fuente, MiPincel, 5, 5, Formato)
 
MiPincel.Dispose()
Formato.Dispose()
Fuente.Dispose()

Ahora no entiendo bien que pretendes lograr, pero eso seria algo sencillo valiendote del gdi, ya que así podrías lograr tu control personalizado o bien usa el paint del control para alterar su dibujado.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Texto Vertical en un control button

Publicado por Adriano (21 intervenciones) el 17/07/2017 13:13:23
Gracias Evan por tu respuesta.

Mi problema es que tengo unas 20 columnas en un DataGridView y necesito poner un texto en la cabecera y por tema de espacio tiene que ser texto vertical.

La solución ideal para mi sería que el DataGridView admitiera text vertical en la cabecera pero al parecer esto no es posible.

Si tienes alguna idea que me ayude te lo agradeceré enormemente.

Tampoco domino lo suficiente la programación como para utilizar el gdi o crear controles personalizados.

Tu código funciona bien y me sirve pero no admite las letras acentuadas.

Un cordial saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Texto Vertical en un control button

Publicado por Adriano (21 intervenciones) el 17/07/2017 14:13:40
Disculpa Evan, SI admite las acentuadas.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Evan Hailey
Val: 55
Ha aumentado su posición en 3 puestos en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Texto Vertical en un control button

Publicado por Evan Hailey (51 intervenciones) el 17/07/2017 19:16:13
No estoy muy familiarizado con ese control porque no me agrada mucho, prefiero usar otros.. Pero me imagino que el concepto ha de ser el mismo, valiendote del gdi como te dije puedes lograr muchas cosas que te suelen sacar de apuros.

Si tu dices que no estas muy afianzado con gdi te digo que esta es tu oportunidad de aprender a usarlo en sus cosillas mas simples como seria escribir una cadena de texto, pintar un rectángulo, etc...

Buen en fin, como tu hablaste de botón yo te pase las bases para un botón simple con texto vertical ("va con acentos ajaja"), así que lo que podría hacer es darle un código un poco mas desarrollado donde el botón te dará un control sobre el fondo(Soporta transparencia), borde, texto y el evento hover.

Mira, aquí el código, espero que te logre ayudar...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
 
Public Class VerticalText : Inherits UserControl
 
    Public Sub New()
        With Me
            .SuspendLayout()
            .BackColor = Color.Transparent
            .Cursor = Cursors.Hand
            .Font = New Font("Verdana", 12, FontStyle.Regular, GraphicsUnit.Point)
            .ForeColor = Color.GhostWhite
            .Size = New Size(35, 170)
            .SetStyle(ControlStyles.SupportsTransparentBackColor, True)
            .SetStyle(ControlStyles.Opaque, False)
            .SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
            .SetStyle(ControlStyles.Selectable, True)
            .ResumeLayout()
        End With
    End Sub
 
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim params As CreateParams = MyBase.CreateParams
            params.ExStyle = &H20
            Return params
        End Get
    End Property
 
    Private Text0 As String = "Acción y Reacción"
    <Category("Apariencia"), Description("Especifica el texto contenido por el control.")>
    Public Property Texto As String
        Get
            Return Text0
        End Get
        Set(ByVal value As String)
            Text0 = value
            Me.Invalidate()
        End Set
    End Property
 
 
    Private BGColor As Color = Color.DarkGoldenrod
    <Category("Apariencia"), Description("Especifica el color de fondo del rectangulo del control.")>
    Public Property ColorFondo() As Color
        Get
            Return BGCOlor
        End Get
        Set(ByVal value As Color)
            BGCOlor = value
            Me.Invalidate()
        End Set
    End Property
 
    Private ColorOver As Color = Color.Gold
    <Category("Apariencia"), Description("Especifica el color de fondo del rectangulo para el evento hover.")>
    Public Property ColorHover() As Color
        Get
            Return ColorOver
        End Get
        Set(ByVal value As Color)
            ColorOver = value
            Me.Invalidate()
        End Set
    End Property
 
    Private Bcolor As Color = Color.Goldenrod
    <Category("Apariencia"), Description("Especifica el color del borde para el rectangulo del control.")>
    Public Property ColorBorde() As Color
        Get
            Return Bcolor
        End Get
        Set(ByVal value As Color)
            Bcolor = value
            Me.Invalidate()
        End Set
    End Property
 
    Private Sub ControlVertical(ByVal ColorTexto As Color, ByVal ColorFondo As Color, ByVal ColorBorde As Color)
        Using g As Graphics = Me.CreateGraphics
            Dim Formato As System.Drawing.StringFormat = New StringFormat(StringFormatFlags.DirectionVertical) '  <- Aquí la magia!!!!
            Dim TextSize As SizeF = g.MeasureString(Text0, Me.Font)
            Dim Pos As Point = New Point(Me.ClientRectangle.Width / 2 - TextSize.Height / 2,
                                         Me.ClientRectangle.Height / 2 - TextSize.Width / 2)
 
            g.FillRectangle(New SolidBrush(ColorFondo), New Rectangle(6, 3, TextSize.Height, TextSize.Width + 10))
            g.DrawString(Text0, Me.Font, New SolidBrush(ColorTexto), Pos.X, Pos.Y, Formato)
            g.DrawRectangle(New Pen(ColorBorde, 1), New Rectangle(6, 3, TextSize.Height, TextSize.Width + 10))
 
            Formato.Dispose()
        End Using
    End Sub
 
    Private Sub VerticalText_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        ControlVertical(Me.ForeColor, ColorOver, Bcolor)
 
    End Sub
 
    Private Sub VerticalText_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        ControlVertical(Me.ForeColor, BGColor, Bcolor)
        Me.Invalidate()
    End Sub
 
    Private Sub VerticalText_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        ControlVertical(Me.ForeColor, BGColor, Bcolor)
    End Sub
 
End Class

Copia esto en una nueva clase.

El resultado seria así, normal y hover!

2pr63pt

Saludos amigo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Texto Vertical en un control button

Publicado por Adriano (21 intervenciones) el 17/07/2017 20:37:03
¡¡¡ Excelente Evan !!!

Gracias mil
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar