hallo,
ich hab mich mal hingesetzt und versucht ein cad grundgerüst (ein anderer name fällt mir nicht ein) gebastelt.
den anstoss dazu hat mir loopy
gegeben.
zumindest habe ich das so verstanden.
hier also der code - ihr braucht dazu zwei button
kommentare erwünscht
gruss
mikeb69
ich hab mich mal hingesetzt und versucht ein cad grundgerüst (ein anderer name fällt mir nicht ein) gebastelt.
den anstoss dazu hat mir loopy
gegeben.
zumindest habe ich das so verstanden.
hier also der code - ihr braucht dazu zwei button
VB.NET-Quellcode
- Public Class Form1
- Private mypos As New List(Of Rectangle) 'alle positionen als client koordinaten
- Private drawpic As Boolean
- Private drawline As Boolean
- Private findpic As Boolean
- Private lastpos As Point
- Private startline As Point
- Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- Me.Button1.Text = "Bilder positionieren"
- Me.Button2.Text = "Linien zeichnen"
- End Sub
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- drawpic = True
- Me.Text = "Bild positionieren"
- End Sub
- Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
- findpic = True
- Me.Text = "Legen Sie jetzt fest bei welchem Bild die Linie beginnen soll."
- End Sub
- Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
- 'hier das gewählte bild zeichnen
- If drawpic = True Then
- drawpic = False
- 'position speichern
- mypos.Add(New Rectangle(e.Location, New Size(30, 30)))
- 'alten frame löschen
- DrawRFrame(Me.RectangleToScreen(New Rectangle(e.Location, New Size(30, 30))), True)
- 'frame fest zeichnen
- Graphics.FromHwnd(Me.Handle).DrawRectangle(New Pen(Color.Black, 2), mypos(mypos.Count - 1))
- End If
- 'hier die linie zeichnen beenden
- If drawline = True Then
- drawline = False
- 'linie wieder entfernen
- DrawRLine(Me.PointToScreen(startline), Me.PointToScreen(lastpos))
- 'prüfen ob sich die maus wirklich über einem bild befindet
- find_pos_arg = e.Location
- Dim p As Integer = mypos.FindIndex(AddressOf find_pos)
- 'linie zeichnen anstossen
- If p <> -1 Then
- 'linie fest zeichnen
- Graphics.FromHwnd(Me.Handle).DrawLine(New Pen(Color.Black, 2), startline, lastpos)
- Me.Text = "Weiter so !"
- Else
- MessageBox.Show("Sie haben nicht über einem Bild geklickt !")
- End If
- End If
- 'hier prüfen, ob die maus sich über einem gezeichneten rectangle befindet
- If findpic = True Then
- find_pos_arg = e.Location
- Dim p As Integer = mypos.FindIndex(AddressOf find_pos)
- 'linie zeichnen anstossen
- If p <> -1 Then
- drawline = True
- startline = mypos(p).Location
- lastpos = mypos(p).Location
- DrawRLine(Me.PointToScreen(startline), Me.PointToScreen(lastpos))
- Me.Text = "Legen Sie jetzt das Bild fest, an welchem die Linie enden soll."
- End If
- End If
- findpic = False
- End Sub
- Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
- If drawpic = True Then
- 'reversible frame zeichnen - bildschirmkoordinaten
- DrawRFrame(Me.RectangleToScreen(New Rectangle(e.X, e.Y, 30, 30)))
- End If
- If drawline = True Then
- lastpos = e.Location
- 'reversible line zeichnen - bildschirmkoordinaten
- DrawRLine(Me.PointToScreen(startline), Me.PointToScreen(lastpos))
- End If
- End Sub
- #Region "Draw Reversible Frame and Line"
- Private Sub DrawRFrame(ByVal newR As Rectangle, Optional ByVal cl As Boolean = False)
- 'die werte hier müssen in bildschrimkoordinaten angegeben werden
- Static oldR As Rectangle
- 'alten frame löschen
- ControlPaint.DrawReversibleFrame(oldR, Color.Black, FrameStyle.Dashed)
- 'neuen frame zeichnen - wenn nicht übermalt werden soll
- If cl = False Then
- ControlPaint.DrawReversibleFrame(newR, Color.Black, FrameStyle.Dashed)
- 'zum übermalen merken
- oldR = newR
- End If
- End Sub
- Private Sub DrawRLine(ByVal startL As Point, ByVal endL As Point)
- 'die werte hier müssen in bildschrimkoordinaten angegeben werden
- Static oldL As Point
- 'alte linie löschen - wenn nicht beide punkte gleich sind
- If startL <> endL Then
- ControlPaint.DrawReversibleLine(startL, oldL, Color.Black)
- End If
- 'neue linie zeichnen
- ControlPaint.DrawReversibleLine(startL, endL, Color.Black)
- 'zum übermalen merken
- oldL = endL
- End Sub
- #End Region
- #Region "suchen und finden"
- Private find_pos_arg As Point
- Private Function find_pos(ByVal r As Rectangle) As Boolean
- If r.X < find_pos_arg.X And r.Right > find_pos_arg.X And _
- r.Y < find_pos_arg.Y And r.Bottom > find_pos_arg.Y Then
- Return True
- Else
- Return False
- End If
- End Function
- #End Region
- End Class
kommentare erwünscht
gruss
mikeb69