none
Tengo esta clase como puedo modificarla RRS feed

  • Pregunta

  • Buenas tengo esta clase como podria modificarla para que en vez sea circlulos las barras sean rectas

    gracias 

    Imports System.Drawing.Drawing2D
    
    Public Class BarraCircular
        Inherits Control
    
        Public Sub New()
            Width = 100
            Height = 100
            Grosor_Linea = 5
            Marcador = 1
            Posicion_Mar = -180
        End Sub
    
        Private _Maximum As Long = 100
        Public Property Maximum() As Long
            Get
                Return _Maximum
            End Get
            Set(ByVal v As Long)
                If v < 1 Then v = 1
                _Maximum = v : Invalidate()
            End Set
        End Property
    
        Private _Value As Long
        Public Property Value() As Long
            Get
                Return _Value
            End Get
            Set(ByVal v As Long)
                If v > _Maximum Then v = _Maximum
                _Value = v : Invalidate()
            End Set
        End Property
    
        Private _Grosor_Linea As Integer = 20
        Public Property Grosor_Linea() As Integer
            Get
                Return _Grosor_Linea
            End Get
            Set(ByVal v As Integer)
                _Grosor_Linea = v : Invalidate()
            End Set
        End Property
        'MARCADOR
        Private _Marcador_Max As Long = 100
       
        Public Property Marcador_Max() As Long
            Get
                Return _Marcador_Max
            End Get
            Set(ByVal v As Long)
                If v < 1 Then v = 1
                _Marcador_Max = v : Invalidate()
            End Set
        End Property
        Private _Marcador_Value As Long
        Public Property Marcador_Value() As Long
            Get
                Return _Marcador_Value
            End Get
            Set(ByVal v As Long)
                If v > _Marcador_Max Then v = _Marcador_Max
                _Marcador_Value = v : Invalidate()
            End Set
        End Property
        Private _Marcador As Integer = 7
        Public Property Marcador() As Integer
            Get
                Return _Marcador
            End Get
            Set(ByVal v As Integer)
                _Marcador = v : Invalidate()
            End Set
        End Property
        Private _Posicion_Mar As Integer = -180
        Public Property Posicion_Mar() As Integer
            Get
                Return _Posicion_Mar
            End Get
            Set(ByVal v As Integer)
                _Posicion_Mar = v : Invalidate()
            End Set
        End Property
        'MARCADOR
    
        Private G As Graphics
    
        'Property Grosor_Linea As Integer
    
        Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs)
        End Sub
    
        Private SZ1 As SizeF
        Private PT1 As PointF
    
        Protected Overrides Sub OnPaint(e As PaintEventArgs)
            Using B As New Bitmap(Width, Height)
                Using G As Graphics = Graphics.FromImage(B)
                    G.SmoothingMode = SmoothingMode.HighQuality
    
                    G.Clear(BackColor)
                    'LINEA ROJA
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Red, Color.Red, LinearGradientMode.Vertical)
                        Using P As New Pen(T, Grosor_Linea)
                            G.DrawArc(P, CInt(Grosor_Linea / 2), CInt(Grosor_Linea / 2), Width - Grosor_Linea - 1, Height - Grosor_Linea - 1, 220, 320)
                        End Using
                    End Using
                    'LINEA ROJA
                    'LINEA AMARILLA IZQUIERDA
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Yellow, Color.Yellow, LinearGradientMode.Vertical)
                        Using P As New Pen(T, Grosor_Linea)
                            G.DrawArc(P, CInt(Grosor_Linea / 2), CInt(Grosor_Linea / 2), Width - Grosor_Linea - 1, Height - Grosor_Linea - 1, 180, 40)
                        End Using
                    End Using
                    'LINEA AMARILLA IZQUIERDA
                    'LINEA AMARILLA DERECHA
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Yellow, Color.Yellow, LinearGradientMode.Vertical)
                        Using P As New Pen(T, Grosor_Linea)
                            G.DrawArc(P, CInt(Grosor_Linea / 2), CInt(Grosor_Linea / 2), Width - Grosor_Linea - 1, Height - Grosor_Linea - 1, 320, 40)
                        End Using
                    End Using
                    'LINEA AMARILLA DERECHA
                    'LINEA VERDE 
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Green, Color.Green, LinearGradientMode.Vertical)
                        Using P As New Pen(T, Grosor_Linea)
                            G.DrawArc(P, CInt(Grosor_Linea / 2), CInt(Grosor_Linea / 2), Width - Grosor_Linea - 1, Height - Grosor_Linea - 1, 0, 180)
                        End Using
                    End Using
                    'LINEA VERDE
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Black, Color.Black, LinearGradientMode.Vertical)
                        Using P As New Pen(T, Grosor_Linea)
    
                            'Remove the spaces ofc v (Round) :F
                            P.StartCap = LineCap.Round : P.EndCap = LineCap.Round
                            G.DrawArc(P, CInt(Grosor_Linea / 2), CInt(Grosor_Linea / 2), Width - Grosor_Linea - 1, Height - Grosor_Linea - 1, -90, CInt((360 / _Maximum) * _Value))
                        End Using
                    End Using
                    'MARCADOR
                    Using T As New LinearGradientBrush(ClientRectangle, Color.Black, Color.Black, LinearGradientMode.Vertical)
                        Using P As New Pen(T, _Marcador)
    
                            'Remove the spaces ofc v (Round) :F
                            P.StartCap = LineCap.Round : P.EndCap = LineCap.Round
                            G.DrawArc(P, CInt(_Marcador / 2), CInt(_Marcador / 2), Width - _Marcador - 1, Height - _Marcador - 1, Posicion_Mar, CInt((360 / _Marcador_Max) * _Marcador_Value))
                        End Using
                    End Using
                    'MARCADOR
                    'Using T As New LinearGradientBrush(ClientRectangle, Color.Gray, Color.Black, LinearGradientMode.Vertical)
                    '    G.FillEllipse(T, Thickness, Thickness, Width - Thickness * 2 - 1, Height - Thickness * 2 - 1)
                    'End Using
                    If Posicion_Mar = 270 Then
                        Text = "Fuera de Estilo"
                    Else
                        Text = CStr(CInt((100 / _Maximum) * _Value)) & "%"
                    End If
                    'Text = CStr(CInt((100 / _Maximum) * _Value)) & "%"
                    SZ1 = G.MeasureString(Text, Font)
                    PT1 = New PointF(Width \ 2 - SZ1.Width / 2, Height \ 2 - SZ1.Height / 2)
    
                    Dim S As SizeF = G.MeasureString(CStr(CInt((100 / _Maximum) * _Value)), Font)
                    G.DrawString(Text, Font, Brushes.Black, PT1)
    
                    'G.DrawEllipse(Pens.Black, 0, 0, Width - 1, Height - 1)
    
                    'G.DrawEllipse(Pens.Black, Thickness, Thickness, Width - Thickness * 2 - 1, Height - Thickness * 2 - 1)
    
                    e.Graphics.DrawImage(B, 0, 0)
                End Using
            End Using
        End Sub
    
    End Class
    
    

    domingo, 27 de noviembre de 2016 12:45

Respuestas

  • [...] esta clase como podria modificarla para que en vez sea circulos las barras sean rectas

    Básicamente la modificación principal que tienes que hacer es cambiar los DrawArc por DrawLine. Pero claro, los argumentos del DrawArc lo que traen son las coordenadas del centro, el radio, y los ángulos de inicio y fin para trazar los arcos. Como es lógico, el DrawLine requiere argumentos distintos, ya que hay que aportarle las coordenadas x,y de los extremos del segmento. Así que tendrás que rehacer todos los cálculos de ángulos y convertirlos en cálculos de coordenadas. Necesitarás desempolvar tus conocimientos de geometría analítica.
    • Marcado como respuesta JETET domingo, 27 de noviembre de 2016 19:34
    • Desmarcado como respuesta JETET domingo, 27 de noviembre de 2016 19:36
    • Marcado como respuesta JETET lunes, 28 de noviembre de 2016 16:32
    domingo, 27 de noviembre de 2016 18:43

Todas las respuestas

  • [...] esta clase como podria modificarla para que en vez sea circulos las barras sean rectas

    Básicamente la modificación principal que tienes que hacer es cambiar los DrawArc por DrawLine. Pero claro, los argumentos del DrawArc lo que traen son las coordenadas del centro, el radio, y los ángulos de inicio y fin para trazar los arcos. Como es lógico, el DrawLine requiere argumentos distintos, ya que hay que aportarle las coordenadas x,y de los extremos del segmento. Así que tendrás que rehacer todos los cálculos de ángulos y convertirlos en cálculos de coordenadas. Necesitarás desempolvar tus conocimientos de geometría analítica.
    • Marcado como respuesta JETET domingo, 27 de noviembre de 2016 19:34
    • Desmarcado como respuesta JETET domingo, 27 de noviembre de 2016 19:36
    • Marcado como respuesta JETET lunes, 28 de noviembre de 2016 16:32
    domingo, 27 de noviembre de 2016 18:43
  • gracias por responder ya lo tengo hecho ahora me falta bloquear el rectangulo en un alto fijo y no se donde tocar

    1000 gracias

    domingo, 27 de noviembre de 2016 19:38