Visual Basic.NET - Como pintar con GDI+?

   
Vista:
Imágen de perfil de Evan Hailey

Como pintar con GDI+?

Publicado por Evan Hailey (41 intervenciones) el 12/07/2017 16:34:32
Saludos gente, hoy me quise poner con un poco de gdi+ que hace mucho que me quería meter y cree un rectángulo con esquinas redondas usando dos lineas y dos arcos... hasta ahí todo bien, he sido capas de lograrlo, pero ahora quería pintarlo (rellenarlo) y la verdad es que no entendí bien las explicaciones que encontré en la web, parece ser que ahí que usar el "FillPath" pero no comprendo como usarlo realmente, podrían ayudarme con este tema por favor, gracias...

1
2
3
4
5
6
7
8
9
Using g As Graphics = Me.PictureBox1.CreateGraphics
            Dim myPath As New GraphicsPath
            g.SmoothingMode = SmoothingMode.HighSpeed
 
            g.DrawArc(Pens.Black, New Rectangle(5, 1, 25, 25), 285, -210)
            g.DrawLine(Pens.Black, 20, 1, 65, 1)
            g.DrawArc(Pens.Black, New Rectangle(55, 1, 25, 25), 255, 210)
            g.DrawLine(Pens.Black, 20, 26, 65, 26)
        End Using

saludos!
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

Como pintar con GDI+?

Publicado por Diego (144 intervenciones) el 13/07/2017 03:48:46
Hola Evan, has dibujado contornos, pero para colorear, debes utilizar los metodos fill y en vez de utilizar Pen utilizas Brushes.

Es a modo ilustrativo, si pudiste dibujar esa figura, seguro podrás con el relleno.
Suerte y +Bytes.
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

Como pintar con GDI+?

Publicado por Evan Hailey (41 intervenciones) el 13/07/2017 15:04:13
Si amigo eso lo se, puedo colorar rectángulo, ellipses etc, porque tienen su forma ya pre-definida... pero como hago para colorear con pincel, usando el método "fill" una forma como la que he dibujado, como le indico al compilador que es un rectángulo con bordes redondos, es ahí donde radica mi problema.
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

Como pintar con GDI+?

Publicado por omar (151 intervenciones) el 13/07/2017 04:26:11
1
2
3
4
5
6
Dim myBrush As New System.Drawing.SolidBrush(System.Drawing.Color.Red)
Dim formGraphics as System.Drawing.Graphics
formGraphics = Me.CreateGraphics()
formGraphics.FillRectangle(myBrush, New Rectangle(0,0,200,300))
myBrush.Dispose()
formGraphics.Dispose()

checa si te sirve evans
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

Como pintar con GDI+?

Publicado por Evan Hailey (41 intervenciones) el 13/07/2017 15:13:02
Gracias por tu código, pero no necesito pintar un rectángulo normal... Lo que he armado es un rectángulo con bordes redondeados, usando dos lineas y dos arcos.

Esto es lo que yo arme!

2w2rgut

Usando este código que yo probando y probando he logrado...

1
2
3
4
5
6
7
8
9
Using g As Graphics = Me.PictureBox1.CreateGraphics
 
    g.SmoothingMode = SmoothingMode.HighSpeed
 
    g.DrawArc(Pens.Black, New Rectangle(5, 1, 25, 25), 285, -210)
    g.DrawLine(Pens.Black, 20, 1, 65, 1)
    g.DrawArc(Pens.Black, New Rectangle(55, 1, 25, 25), 255, 210)
    g.DrawLine(Pens.Black, 20, 26, 65, 26)
End Using

Ahora quiero pintar esto sin excederme de los limites del dibujo y completamente relleno.
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

Como pintar con GDI+?

Publicado por Diego (144 intervenciones) el 14/07/2017 03:14:50
En tu primer código utilizaste un GraphicPath para ir armando tu figura. En vez de ir dibujando, tenés que ir agregando a lo que se llamaría un "camino" de figuras, que luego rellenas con fillPath, eso sirve para hacer figuras irregulares. Este codigo, haría lo mismo que pretendes hacer, pintando el interior de color Rojo.

Fijate que se utilizan metodos del tipo Add, no draw.

1
2
3
4
5
6
7
8
9
10
Using g As Graphics = Me.PictureBox1.CreateGraphics
            Dim myPath As New GraphicsPath
            g.SmoothingMode = SmoothingMode.HighSpeed
 
            myPath.AddArc(New Rectangle(5, 1, 25, 25), 285, -210)
            myPath.AddRectangle(New Rectangle(21, 2, 44, 24))
            myPath.AddArc(New Rectangle(55, 1, 25, 25), 255, 210)
 
            g.FillPath(Brushes.Red, myPath)
        End Using

Saludos y +Bytes
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Evan Hailey

Como pintar con GDI+?

Publicado por Evan Hailey (41 intervenciones) el 14/07/2017 23:35:38
Bueno voy entendiendo, dos arcos y un rectángulo en el centro.. Vale decir que si le quisiera dar un borde, debería agregar mi código de arcos y lineas verdad???
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

Como pintar con GDI+?

Publicado por Diego (144 intervenciones) el 15/07/2017 20:20:48
Porsupollo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Evan Hailey

Como pintar con GDI+?

Publicado por Evan Hailey (41 intervenciones) el 16/07/2017 02:12:40
Bueno estuve estudiando mucho la situación y bueno.. Mi idea era lograr esa forma para crear un botón con esquinas redondeadas, para no tener que depender de librerias...

Bueno ya que aquí me dieron una mano dejare el código completo del botón que he creado...

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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Imports System.Drawing.Drawing2D
Imports System.ComponentModel
 
Public Class BotonPersonalizado : Inherits UserControl
 
#Region " [ ### CONSTRUCTOR ### ] "
 
    Public Sub New()
        With Me
            .SuspendLayout()
            .BackColor = Color.Transparent
            .Cursor = Cursors.Hand
            .Font = New Font("Microsoft Sans Serif", 9, FontStyle.Regular, GraphicsUnit.Point)
            .ForeColor = Color.White
            .MinimumSize = New Size(25, 20)
            .SetStyle(ControlStyles.SupportsTransparentBackColor, True)
            .SetStyle(ControlStyles.ResizeRedraw, True)
            .SetStyle(ControlStyles.Opaque, False)
            .SetStyle(ControlStyles.OptimizedDoubleBuffer, False)
            .SetStyle(ControlStyles.Selectable, True)
            .Size = New Size(125, 28)
            .TabStop = True
            .Texto = "Personal Button"
            .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
#End Region
 
#Region " [ ### PROPIEDADES ### ] "
 
    Private Color1 As Color = Color.MediumSeaGreen
    <Category("Degradado"), Description("Especifica el color primario del fondo degradado.")>
    Public Property ColorPrimario() As Color
        Get
            Return Color1
        End Get
        Set(ByVal value As Color)
            Color1 = value
            Me.Invalidate()
        End Set
    End Property
 
 
    Private Color2 As Color = Color.FromArgb(33, 38, 34)
    <Category("Degradado"), Description("Especifica el color secundario del fondo degradado.")>
    Public Property ColorSecundario() As Color
        Get
            Return Color2
        End Get
        Set(ByVal value As Color)
            Color2 = value
            Me.Invalidate()
        End Set
    End Property
 
    Private ColorOver1 As Color = Color.Goldenrod
    <Category("Degradado"), Description("Especifica el color que usara el fondo degradado para el efecto hover.")>
    Public Property ColorHover() As Color
        Get
            Return ColorOver1
        End Get
        Set(ByVal value As Color)
            ColorOver1 = value
            Me.Invalidate()
        End Set
    End Property
 
 
    Private Text0 As String
    <Category("Appearance"), Description("Especifica el texto que mostrara 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
 
#End Region
 
#Region " [ ### DIBUJADO ### ] "
 
 
    ' Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    Private Sub DibujarBoton(ByVal colorA As Color, ByVal colorB As Color)
 
        Dim g As Graphics = Me.CreateGraphics
        g.InterpolationMode = InterpolationMode.HighQualityBilinear
        g.CompositingQuality = CompositingQuality.HighQuality
        g.PixelOffsetMode = PixelOffsetMode.HighQuality
        g.SmoothingMode = SmoothingMode.AntiAlias
 
        Dim brush As New LinearGradientBrush(Me.ClientRectangle, colorA, colorB, 90, True)
 
 
        Using gp As New GraphicsPath()
            AddRoundedRectangle(gp, New Point(1, 1), New Size(Me.Size.Width - 2, Me.Size.Height - 2))
            g.FillPath(brush, gp)
        End Using
 
        'Using gp As New GraphicsPath() 
        '    AddRoundedRectangle(gp, New Point(0, 0), Me.Size)
        '    Me.Region = New Region(gp)   '  <- TAMBIEN SE PUEDE USAR ASI.
        'End Using
        '  MyBase.OnPaint(Me.CreateGraphics)
 
        Using gText As Graphics = Me.CreateGraphics
            Dim TextSize As SizeF = gText.MeasureString(Text0, Me.Font)
            gText.DrawString(Text0, Me.Font, New SolidBrush(Me.ForeColor), (Me.Width / 2) - (TextSize.Width / 2), (Me.Height / 2) - (TextSize.Height / 2))
        End Using
 
        brush.Dispose()
        g.Dispose()
 
    End Sub
 
    Private Sub AddRoundedRectangle(ByVal gp As GraphicsPath, ByVal upperLeft As Point, ByVal size As Size)
        gp.AddArc(New Rectangle(upperLeft, New Size(size.Height, size.Height)), 90, 180)
        gp.AddLine(New Point(size.Height / 2, upperLeft.Y), New Point(size.Width - (size.Height / 2), upperLeft.Y))
        gp.AddArc(New Rectangle(New Point(size.Width - size.Height, upperLeft.Y), New Size(size.Height, size.Height)), -90, 180)
        gp.CloseFigure()
    End Sub
#End Region
 
 
    Private Sub BotonPersonalizado_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
        MsgBox("Esta porqueria funciona!")
    End Sub
 
    Private Sub BotonPersonalizado_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
        DibujarBoton(ColorOver1, Color2)
    End Sub
 
    Private Sub BotonPersonalizado_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        DibujarBoton(Color1, Color2)
    End Sub
 
    Private Sub BotonPersonalizado_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        DibujarBoton(Color1, Color2)
    End Sub
 
 
End Class

Bueno también dejo una captura, porque cuando yo recién comenzaba se me hacia muy complicado entender los códigos.


2eeli08


Saludos a todos y muchas gracias por la ayuda!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar