Feedback

VB - Linien u. Kreise a la VB6 - Einfach Zeichnen

Veröffentlicht von am 17.12.2007
(4 Bewertungen)
Da in VB.net die Linien etc von VB6 fehlen, ist hier der Ersatz ;)
Seltsam, dass das VS KEINERLEI Möglichkeiten bietet, außer per Code, Linien zu zeichnen.

Es können(mit der eigenschaft "FormArt"):
----------
Rechtecke
Quadrate
Kreise/Elipsen
Diagonalen(noch nicht ganz fertig)

mit und ohne Rand dargestellt werden.
Die Diagonalen verwenden den "Rand" zur Darstellung, also auch Dicke und Farbe.

--------------------------------------
-----------ANWENDUNG:-----------
--------------------------------------
Es MUSS ein neues Benutzersteuerelement (Usercontrol)
mit dem Namen:uscSymbols erzeugt werden
und anschließend diesen Code hineinkopieren.

--------------------------------------
Anmerkung:

Bei SO schlechten! Votes, wüsste ich WIRKLICH GERNE WARUM!
Dann kann man vieleicht auch was "besser" machen!
eine kleine bemerkung wäre ja wohl nicht zuviel verlangt bei 3 Punkten oder?
'Es MUSS ein neues Benutzersteuerelement (Usercontrol)
'mit dem Namen:uscSymbols erzeugt werden
'und anschließend diesen Code hineinkopieren:

'© General Bison
'Da in VB.net die Linien etc von VB6 fehlen,
'ist hier der Ersatz ;)
'
'Info:
'Da das VisualStudio im Designer das Ziehen
'des Objektes kleiner 10Pixel nicht zulässt,
'MUSS die Höhe/Breite per Hand eingegeben werden,
'damit man eine Linie erhält.

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.ComponentModel

Public Class uscSymbols
    Private Sub uscSymbols_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Public Enum FormArtEnum
        <Description("Control wird als Rechteck dargestellt(als Linie nutzbar!)")> Rechteck
        <Description("Stellt einen Kreis/Elipse dar")> Kreis
        <Description("Das Control ist IMMMER Quadratisch")> Quadrat
        <Description("links oben nach rechts unten")> LinksOben_RechtsUnten
        <Description("rechts oben nach links unten")> RechtsOben_LinksUnten
    End Enum

    Private _FormArt As FormArtEnum = FormArtEnum.Rechteck
    <Description("Die Darstellungsart")> _
    Public Property FormArt() As FormArtEnum
        Get
            Return _FormArt
        End Get
        Set(ByVal value As FormArtEnum)
            If _FormArt = FormArtEnum.Kreis AndAlso value <> _FormArt Then
                CheckMyArt(value)
            End If
            _FormArt = value

            If value > FormArtEnum.Quadrat Then
                _RandSichtbar = True
            End If
            Me.Refresh()
        End Set
    End Property

    Private _LockHeight As Integer
    Private _SizeHeightLock As Boolean = False
    <Description("Sperrt die aktuelle Höhe")> _
    Public Property SizeHeightLock() As Boolean
        Get
            Return _SizeHeightLock
        End Get
        Set(ByVal value As Boolean)
            _SizeHeightLock = value
            _LockHeight = Me.Height
            Me.Refresh()
        End Set
    End Property

    Private _LockWidth As Integer
    Private _SizeWidthLock As Boolean = False
    <Description("Sperrt die aktuelle Breite")> _
    Public Property SizeWidthLock() As Boolean
        Get
            Return _SizeWidthLock
        End Get
        Set(ByVal value As Boolean)
            _SizeWidthLock = value
            _LockWidth = Me.Width
            Me.Refresh()
        End Set
    End Property

#Region "Rand"
    Private _RandSichtbar As Boolean = False
    <Description("Rand Darstellen")> _
    Public Property RandSichtbar() As Boolean
        Get
            Return _RandSichtbar
        End Get
        Set(ByVal value As Boolean)
            _RandSichtbar = value
            Me.Refresh()
        End Set
    End Property

    Private _RandDicke As Integer = 0
    <Description("Randdicke in Pixeln. Kann nicht kleiner 0 sein!")> _
    Public Property RandDicke() As Integer
        Get
            Return _RandDicke
        End Get
        Set(ByVal value As Integer)
            If value >= 0 Then
                _RandDicke = value
            End If
            Me.Refresh()
        End Set
    End Property

    Private _RandFarbe As System.Drawing.Color = Color.White
    <Description("Randfarbe")> _
    Public Property RandFarbe() As System.Drawing.Color
        Get
            Return _RandFarbe
        End Get
        Set(ByVal value As System.Drawing.Color)
            _RandFarbe = value
            Me.Refresh()
        End Set
    End Property
#End Region

    Private _Qualitaet As SmoothingMode = SmoothingMode.Default
    <Description("Qualität des Objekts (zur zeit nur mit Effekt auf den Rand)")> _
    Public Property Qualitaet() As SmoothingMode
        Get
            Return _Qualitaet
        End Get
        Set(ByVal value As SmoothingMode)
            _Qualitaet = value
            Me.Refresh()
        End Set
    End Property

    Private Sub CheckMyArt(ByVal myart As FormArtEnum)
        Select Case myart
            Case FormArtEnum.Kreis
                Dim Sb As New System.Drawing.Drawing2D.GraphicsPath
                Sb.AddEllipse(2, 2, Me.Width - 5, Me.Height - 5)
                Me.Region = New System.Drawing.Region(Sb)
            Case Else
                Dim Sb As New System.Drawing.Drawing2D.GraphicsPath
                Dim r As New Rectangle(0, 0, Me.Width, Me.Height)
                Sb.AddRectangle(r)
                Me.Region = New System.Drawing.Region(Sb)
        End Select
    End Sub

    Private Sub uscSymbols_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        e.Graphics.SmoothingMode = _Qualitaet
        Dim p As Pen
        Dim r As Rectangle
        CheckMyArt(_FormArt)

        Select Case _FormArt
            Case FormArtEnum.Kreis
                If RandSichtbar = True Then
                    p = New Pen(_RandFarbe, _RandDicke)
                    r = New Rectangle(2, 2, Me.Width - 5, Me.Height - 5)
                    e.Graphics.DrawEllipse(p, r)
                End If

            Case FormArtEnum.Rechteck, FormArtEnum.Quadrat
                If RandSichtbar = True Then
                    p = New Pen(_RandFarbe, _RandDicke)
                    r = New Rectangle(0, 0, Me.Width, Me.Height)
                    e.Graphics.DrawRectangle(p, r)
                End If

            Case FormArtEnum.LinksOben_RechtsUnten
                p = New Pen(_RandFarbe, _RandDicke)
                e.Graphics.DrawLine(p, 0, 0, Me.Width, Me.Height)

            Case FormArtEnum.RechtsOben_LinksUnten
                p = New Pen(_RandFarbe, _RandDicke)
                e.Graphics.DrawLine(p, Me.Width, 0, 0, Me.Height)

        End Select
    End Sub

    Private Sub uscSymbols_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        Select Case _FormArt
            Case FormArtEnum.Quadrat
                If Me.Width <> Me.Height Then
                    Me.Height = Me.Width
                End If
        End Select
        If _SizeHeightLock = True Then
            Me.Height = _LockHeight
        End If
        If _SizeWidthLock = True Then
            Me.Width = _LockWidth
        End If
    End Sub
End Class

6 Kommentare zum Snippet

Mathys JP schrieb am 06.02.2008:
Zugegeben ich bin blutiger Anfänger ... ich habe das alles so gemacht wie es da stand. Aber wie geht es nachher weiter? Hab ich dann irgendwo ein Menü wo ich zB eine Linie per drag n drop in mein Form ziehen kann?

Ich kann den letzten schritt irgendwie nicht nachvollziehen was zu tun ist.

Hoffe auf Hilfe ... Danke.
General Bison schrieb am 09.02.2008:
Also nachdem du das Benutzersteuerelement(UserControl) erstellt und den Code hinein kopiert hast, !MUSST! du auf:
Erstellen-> >PROJEKTNAME> neu erstellen
klicken.
Erst dann werden eigene Benutzersteuerelemente verfügbar.
Anschließend gehst du auf ein Formular und nimmst, Links in der Toolbox, das neue Control ganz oben mit Zahnradsymbol.
Das nimmst du und packst es auf die Form.
Fertig ;)
Mathys JP schrieb am 15.02.2008:
OK, das hat so weit alles geklappt. Aber ... wie mache ich eine einfache Waagerechte oder Senkrechte Linie? Und, lässt sich die Breite der Linie irgendwie ändern?
Koopakiller schrieb am 21.10.2014:
Microsoft bietet das Visual Basic Power Pack an, in dem sind auch Controls für Linien, Rechtecke und Ellipsen enthalten.
Das Control hier kann man sich also sparen.
General Bison schrieb am 21.10.2014:
Ja, inzwischen.
Aber wenn du auf das Datum siehst, stellst du sicher fest, dass es von 17.12.2007 ist und es das zu diesem Zeitpunkt noch nicht gab ;)
Koopakiller schrieb am 22.10.2014:
Das Datum habe ich schon gelesen, nur bin ich davon ausgegangen, dass es die Controls da auch schon gab. Das letzte PowerPack (V3) stammt von 2008, zu den Vorgängern fand ich leider keine exakten Informationen mehr.
 

Logge dich ein, um hier zu kommentieren!