Hallo zusammen,
ich benötige Eure Hilfe bei folgendem Problem.
Ich habe ein kleines Testprogramm geschrieben das ein Rectangle zeichnet welches ich mit der Maus auswählen und verschieben kann. Das funktioniert .
Das gleiche versuche ich in einem weiteren kleinen Testcode mit einer Line. Das funktioniert nicht .
Ich probiere da jetzt schon eine geraume Weile dran rum. Mir ist der Gedanke gekommen dass die Sache nicht funktioniert da die Line keine Fläche wie das Rectangle hat und der Grapg der Line und der des Rectangles nicht auswählbar zu sein scheint. Die einzige Lösung scheint mir zu sein für den Start- und Endpunkt der Line je einen Anfasser zu zeichnen und zwar mit einer Figur die eine Fläche hat (Rectangle, Ellipse).
Beim anklicken mit der linken Maustaste dann die Anfasser samt Line zu verschieben und mit der rechten Maustaste z.B. Längenänderungen vorzunehmen.
Oder gibt es da eine bessere Möglichkeit Shapes ohne eine Fläche auszuwählen?
Hier zuerst der Code des funktionierenden Programms mit dem Rectangle dann dernicht funktionierende Line-Code.
Rectangle:
Line:
Vielen Dank für Eure Mühe und Hilfe vorab,
Duste
ich benötige Eure Hilfe bei folgendem Problem.
Ich habe ein kleines Testprogramm geschrieben das ein Rectangle zeichnet welches ich mit der Maus auswählen und verschieben kann. Das funktioniert .
Das gleiche versuche ich in einem weiteren kleinen Testcode mit einer Line. Das funktioniert nicht .
Ich probiere da jetzt schon eine geraume Weile dran rum. Mir ist der Gedanke gekommen dass die Sache nicht funktioniert da die Line keine Fläche wie das Rectangle hat und der Grapg der Line und der des Rectangles nicht auswählbar zu sein scheint. Die einzige Lösung scheint mir zu sein für den Start- und Endpunkt der Line je einen Anfasser zu zeichnen und zwar mit einer Figur die eine Fläche hat (Rectangle, Ellipse).
Beim anklicken mit der linken Maustaste dann die Anfasser samt Line zu verschieben und mit der rechten Maustaste z.B. Längenänderungen vorzunehmen.
Oder gibt es da eine bessere Möglichkeit Shapes ohne eine Fläche auszuwählen?
Hier zuerst der Code des funktionierenden Programms mit dem Rectangle dann dernicht funktionierende Line-Code.
Rectangle:
VB.NET-Quellcode
- Option Strict On
- Public Class Form1
- 'Start der Drag-Operation.
- Private _startPoint As Point
- 'Befindet sich die location innerhalb des Rectangles(_box).
- Private _locInBox As Boolean
- 'Koordinaten der _box
- Private _box As New Rectangle(200, 200, 50, 50)
- Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
- If MouseButtons = MouseButtons.Left Then
- Dim myLocation As Point = e.Location
- 'Startpunkt der draw Operation merken
- _startPoint = myLocation
- 'Muss hier initialisiert werden sonst verliert der Mauszeiger bei zu schnellem ziehen die _box
- _locInBox = IsLocationInBox(myLocation)
- End If
- End Sub
- Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
- If MouseButtons = MouseButtons.Left Then
- If _locInBox = True Then
- Dim myLocation As Point = e.Location
- InvalidateRectangle(_box) 'Neu zeichnen der alten _box Location.
- _box.Offset(myLocation.X - _startPoint.X, myLocation.Y - _startPoint.Y) '_box mit MouseZeiger bewegen.
- _startPoint = myLocation 'Startpunkt für den nächsten Drag festlegen.
- InvalidateRectangle(_box) 'Neu zeichnen der neuen _box Location.
- End If
- End If
- End Sub
- Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
- e.Graphics.DrawRectangle(Pens.Black, _box)
- End Sub
- Private Function IsLocationInBox(myLocation As Point) As Boolean
- Dim result As Boolean = False 'Für den Fall dass es keine StandardBox gibt.
- If _box.Contains(myLocation) Then
- result = True 'Angefragte Location liegt in der _box.
- End If
- Return result
- End Function
- Private Sub InvalidateRectangle( box As Rectangle)
- box.Inflate(10, 10)
- Invalidate(box)
- End Sub
- End Class
Line:
VB.NET-Quellcode
- Option Strict On
- Public Class Form1
- 'Start der Drag-Operation.
- Private _lineStartPoint As Point
- 'Befindet sich die location innerhalb des Rectangles(_line).
- Private _lineLocInBox As Boolean
- 'Koordinaten der _line
- Private _line As Point() = {New Point (100, 100), New Point ( 250, 100)}
- Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
- If MouseButtons = MouseButtons.Left Then
- Dim lineLocation As Point = e.Location
- 'Startpunkt der draw Operation merken
- _lineStartPoint= lineLocation
- 'Muss hier initialisiert werden sonst verliert der Mauszeiger bei zu schnellem ziehen die _box
- _lineLocInBox = IsLocationInLine(lineLocation)
- End If
- End Sub
- Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
- If MouseButtons = MouseButtons.Left Then
- If _lineLocInBox = True Then
- Dim lineLocation As Point = e.Location
- _line(0).Offset(lineLocation.X - _lineStartPoint.X, lineLocation.Y - _lineStartPoint.Y) '_line mit MouseZeiger bewegen.
- _line(1).Offset(lineLocation.X - _lineStartPoint.X, lineLocation.Y - _lineStartPoint.Y) '_line mit MouseZeiger bewegen.
- Invalidate() 'Neu zeichnen
- End If
- End If
- End Sub
- Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
- e.Graphics.DrawLine(Pens.Black, _line(0),_line(1))
- End Sub
- Private Function IsLocationInLine(lineLocation As Point) As Boolean
- Dim result As Boolean = False 'Für den Fall dass es keine StandardLine gibt.
- If _line.Contains(lineLocation) Then
- result = True 'Angefragte Location liegt in der _line
- End If
- Return result
- End Function
- End Class
Vielen Dank für Eure Mühe und Hilfe vorab,
Duste