Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  VBasic / vb.net / vbs / wsh
  Auswahlrahmen in falschem Bereich

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Auswahlrahmen in falschem Bereich (1504 mal gelesen)
KlausXP
Mitglied
Dipl.-Ing.


Sehen Sie sich das Profil von KlausXP an!   Senden Sie eine Private Message an KlausXP  Schreiben Sie einen Gästebucheintrag für KlausXP

Beiträge: 70
Registriert: 17.09.2004

VS2013 Professional

erstellt am: 14. Sep. 2014 10:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2657
Registriert: 06.11.2000

erstellt am: 15. Sep. 2014 12:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KlausXP 10 Unities + Antwort hilfreich

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...



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KlausXP 10 Unities + Antwort hilfreich

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.


Sehen Sie sich das Profil von KlausXP an!   Senden Sie eine Private Message an KlausXP  Schreiben Sie einen Gästebucheintrag für KlausXP

Beiträge: 70
Registriert: 17.09.2004

VS2013 Professional

erstellt am: 15. Sep. 2014 21:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Klaus,

Vielen Dank für die Antwort. Habe vorerst Variante 1 eingebaut, sie funktioniert. Morgen werde ich noch Variante 2 ausprobieren, die habe ich aber noch nicht verstanden.

Klaus

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz