Autor
|
Thema: Auswahlrahmen in falschem Bereich (1504 mal gelesen)
|
KlausXP Mitglied Dipl.-Ing.
Beiträge: 70 Registriert: 17.09.2004 VS2013 Professional
|
erstellt am: 14. Sep. 2014 10:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum, in einer VB.Net-Anwendung habe ich in einer Form ein Tabcontrol, in welches ich ein Panel eingefügt habe. In diesem Panel sind nun ein Toolstrip oben und unten eine Picturebox. Nun versuche ich einen Auswahlrahmen in der Picturebox mit der Maus aufzuziehen, nur der Auswahlrahmen wird nicht in der Picturebox dargestellt, sondern beginnt schon beim Tabcontrol und schließt den Toolstrip auch ein. Ich will aber, daß der Auswahlrahmen nur in der Picturebox gezeichnet wird. Der Rahmen wird mit mit der Breite von Tabcontrol und Toolstrip versetzt zur Mausposition gezeichnet. Hier ist der Code: Private Sub Picturebox1_Mousedown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseDown 'Speichert die Mauskoordinaten beim Drücken der Maus p1 = e.Location p2 = e.Location End Sub Private Sub Picturebox1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseMove Dim g As Graphics = Picturebox1.CreateGraphics If e.Button = Windows.Forms.MouseButtons.Left Then ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen p2 = e.Location ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen neu erzeugen End If End Sub Private Sub Picturebox1_Mouseup(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Picturebox1.MouseUp Dim g As Graphics = Picturebox1.CreateGraphics ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen End Sub Kann mir jemand weiterhelfen? Viele Grüße Klaus [Diese Nachricht wurde von KlausXP am 14. Sep. 2014 editiert.] [Diese Nachricht wurde von KlausXP am 14. Sep. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000
|
erstellt am: 15. Sep. 2014 12:00 <-- editieren / zitieren --> Unities abgeben: Nur für KlausXP
e.location gibt die relative Position in der PictureBox zurück. Da du beim "Malen" mit PointToScreen arbeitest, musst du diese relative Position in Bildschirmkoordinaten umrechnen. Dazu musst du die Positionen (Location) aller Eltern-Elemente noch addieren und eventuell vorhandene Ränder (Padding). Ich hab's mal nachgebaut, allerdings noch ohne Toolstrip. Ein Problem habe ich noch: ich weiß nicht, wie man die Höhe der Tabs (Reiter) feststellt. Die musst du auch noch dazu zählen beim Y-Wert. Ich hab die hier mal Quick'n'Dirty als Konstante TabHeight = 20 eingefügt. Code: Public Class Form1 Dim p1 As Point Dim p2 As Point Const TabHeight = 20 Private Sub Picturebox1_Mousedown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 'Speichert die Mauskoordinaten beim Drücken der Maus p1 = e.Location + New Point(TabControl1.Location.X, TabControl1.Location.Y) _ + New Point(TabControl1.Padding.X, TabControl1.Padding.Y) _ + New Point(PictureBox1.Location.X, PictureBox1.Location.Y) _ + New Point(0, TabHeight) p2 = e.Location + New Point(TabControl1.Location.X, TabControl1.Location.Y) _ + New Point(TabControl1.Padding.X, TabControl1.Padding.Y) _ + New Point(PictureBox1.Location.X, PictureBox1.Location.Y) _ + New Point(0, TabHeight) End Sub Private Sub Picturebox1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove Dim g As Graphics = PictureBox1.CreateGraphics If e.Button = Windows.Forms.MouseButtons.Left Then ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen p2 = e.Location + New Point(TabControl1.Location.X, TabControl1.Location.Y) _ + New Point(TabControl1.Padding.X, TabControl1.Padding.Y) _ + New Point(PictureBox1.Location.X, PictureBox1.Location.Y) _ + New Point(0, TabHeight) ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen neu erzeugen End If End Sub Private Sub Picturebox1_Mouseup(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp Dim g As Graphics = PictureBox1.CreateGraphics ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen End Sub End Class
------------------ Klaus www.al-ko.com | mein Gästebuch [Diese Nachricht wurde von KMassler am 15. Sep. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2657 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** Dell Precision 7540 mobile Workstation, 64GB, Quadro RTX 3000; SWX2020 SP5; SAP/PLM+ECTR; DriveWorks Pro; Programmierung: VBA, aktuell Visual Studio 2017/VB.Net
|
erstellt am: 15. Sep. 2014 12:15 <-- editieren / zitieren --> Unities abgeben: Nur für KlausXP
Ups- noch einfacher: Beim Speichern der Mouse-Koordinaten in Screen-Koordinaten umrechnen, und dafür nachher nicht mehr: Code: Public Class Form1 Dim p1 As Point Dim p2 As Point Const TabHeight = 20 Private Sub Picturebox1_Mousedown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 'Speichert die Mauskoordinaten beim Drücken der Maus Dim control As Control = CType(sender, Control) 'Original: 'p1 = e.Location 'p2 = e.Location 'Neue Version 'Client-Koordinaten in Bildschirmkoordinaten umrechnen und speichern: p1 = Control.PointToScreen(New Point(e.X, e.Y)) p2 = Control.PointToScreen(New Point(e.X, e.Y)) End Sub Private Sub Picturebox1_Mousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove Dim control As Control = CType(sender, Control) 'Graphics-Object nicht verwendet 'Dim g As Graphics = PictureBox1.CreateGraphics If e.Button = Windows.Forms.MouseButtons.Left Then 'Zeichnen ohne PointToScreen: 'Original: 'ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), _ 'New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen 'p2 = e.Location 'ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), _ 'New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen neu erzeugen 'Neue Version, PointToScreen wird beim Zeichnen nicht mehr benötigt, 'da die Punkte p1 und p2 ja schon Bildschirmkoordinaten enthalten: ControlPaint.DrawReversibleFrame(New Rectangle(p1, _ New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen 'Auch hier: Client-Koordinaten in Bildschirmkoordinaten umrechnen und speichern: p2 = control.PointToScreen(New Point(e.X, e.Y)) 'Und wieder Zeichnen ohne nochmaliges Umrechnen ControlPaint.DrawReversibleFrame(New Rectangle(p1, _ New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen neu erzeugen End If End Sub Private Sub Picturebox1_Mouseup(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp 'Graphics-Object nicht verwendet 'Dim g As Graphics = PictureBox1.CreateGraphics 'Original: 'ControlPaint.DrawReversibleFrame(New Rectangle(PointToScreen(p1), _ 'New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen 'Neue Version, Auch hier: PointToScreen wird beim Zeichnen nicht mehr benötigt, 'da die Punkte p1 und p2 ja schon Bildschirmkoordinaten enthalten: ControlPaint.DrawReversibleFrame(New Rectangle(p1, _ New Size(p2.X - p1.X, p2.Y - p1.Y)), Color.Black, FrameStyle.Dashed) 'Rahmen löschen End Sub End Class
------------------ Klaus [Edit]Ich habe deinen ursprünglichen Code noch als Kommentar eingefügt und die zu ändernden Teile markiert, ich hoffe das macht das deutlicher. In deiner Version hast du immer die relativen Koordinaten (relativ zur Control-Fenster-Position) in den Punkten p1 und p2 gespeichert und dann beim Zeichnen auf Bildschirmkoordinaten gemalt. Da hättest du immer erst die X- und Y-Postitionen sämtlicher übergeordneter Fenster dazu rechnen müssen (meine Variante 1). Hier habe ich die Mausposition schon beim Speichern in Bildschirmkoordinaten umgesetzt. Damit kannst du dann einfach beim Malen diese Koordinaten ohne weitere Umrechnung verwenden. [/Edit] [Nochmal Edit]Sorry, hatte noch versehentlich 2x PictureBox2 statt PictureBox1 drin stehen. Allerdings in 2 überflüssigen Zeilen, drum wirkt sich das nicht aus. Die 2 überflüssigen Zeilen sind Dim g As Graphics = PictureBox1.CreateGraphics Da du das Graphics-Object nicht verwendest, ist das auch nicht nötig, also jetzt auch auskommentiert [/Nochmal Edit] www.al-ko.com | mein Gästebuch [Diese Nachricht wurde von KMassler am 16. Sep. 2014 editiert.] [Diese Nachricht wurde von KMassler am 17. Sep. 2014 editiert.] [Diese Nachricht wurde von KMassler am 17. Sep. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlausXP Mitglied Dipl.-Ing.
Beiträge: 70 Registriert: 17.09.2004 VS2013 Professional
|
erstellt am: 15. Sep. 2014 21:54 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|