Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
595 views
in Technique[技术] by (71.8m points)

vb.net - Draw a rectangle with the mouse, but not when OpenfileDialog is busy

I have a Form1 and a PictureBox. I have also subscribed to the MouseDown, MouseMove and MouseUp events in order to be able to draw a rectangle on the PictureBox with the mouse. In itself, it works fine. Now I am using an OpenFileDialog. If I select the file in the window and click on 'OK', the dialog disappears, but – and this is my problem – a rectangle is drawn immediately because I moved the mouse. I don't want that to happen at the moment. I've already tried to use a Boolean variable to lock the MouseMove procedure, but unfortunately that didn't work.OpenFileDialog Here you can see the accidentally created rectangle

Imports Microsoft.WindowsAPICodePack.Dialogs
Public NotInheritable Class Form1
    Private Mausstartpunkt As Point ' Mouse start point
    Private Mausendpunkt As Point ' Mouse end point
    Public Shared Property Picture1 As Bitmap 'dann bleibt es im Anwendungs-Scope, wenn die Klasse verf?llt.
    Private Pfad_Bild As String = ""
    Private Pfad_speichern As String = ""
    Private It_is_allowed_to_draw As Boolean
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        
    End Sub

    Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
        If PictureBox1.Image IsNot Nothing AndAlso It_is_allowed_to_draw AndAlso Not String.IsNullOrEmpty(Pfad_Bild) Then
            Dim rect As Rectangle = PointsToRectangle(Mausstartpunkt, Mausendpunkt)
            AllesGrafische.Paint_the_Rectangle(e.Graphics, rect)
        End If
    End Sub

    Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
        If e.Button = MouseButtons.Left Then
            Mausstartpunkt = System.Windows.Forms.Control.MousePosition
            Mausstartpunkt = New Point(Mausstartpunkt.X - 8, Mausstartpunkt.Y - 31)
        End If
        If e.Button = MouseButtons.Right Then ' clears the rectangle
            Mausstartpunkt = New Point(0, 0)
            Mausendpunkt = New Point(0, 0)
            PictureBox1.Invalidate()
        End If
    End Sub

    Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
        If e.Button = MouseButtons.Left Then
            Mausendpunkt = System.Windows.Forms.Control.MousePosition
            Mausendpunkt = New Point(Mausendpunkt.X - 8, Mausendpunkt.Y - 31)
            PictureBox1.Invalidate()
        End If
    End Sub

    Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
        If e.Button = MouseButtons.Left Then
            Mausendpunkt = System.Windows.Forms.Control.MousePosition
            Mausendpunkt = New Point(Mausendpunkt.X - 8, Mausendpunkt.Y - 31)
            PictureBox1.Invalidate()
        End If
    End Sub

    Public Shared Function PointsToRectangle(ByVal p1 As Point, ByVal p2 As Point) As Rectangle 'https://www.vb-paradise.de/index.php/Thread/20037-Rechteck-mit-Maus-zeichnen-Erledigt/?postID=124893#post124893
        Dim r As New Rectangle With {
            .Width = Math.Abs(p1.X - p2.X),
            .Height = Math.Abs(p1.Y - p2.Y),
            .X = Math.Min(p1.X, p2.X),
            .Y = Math.Min(p1.Y, p2.Y)
        }
        Return r
    End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PictureBox1.Image = Nothing
        Using OFD As New CommonOpenFileDialog
            OFD.Title = "Datei zum ?ffnen ausw?hlen"
            OFD.Filters.Add(New CommonFileDialogFilter("Bilder", ".jpg;.jpeg;.bmp"))
            OFD.Filters.Add(New CommonFileDialogFilter("PNG", ".png"))
            OFD.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
            If OFD.ShowDialog() = CommonFileDialogResult.Ok Then
                Pfad_Bild = OFD.FileName
                Pfad_speichern = Pfad_Bild.Substring(0, Pfad_Bild.LastIndexOf("", StringComparison.Ordinal) + 1) ' for example "C:UsersmyNamePictures", or "C:UsersmyNameDesktop"
            Else
                
                Return
            End If
        End Using

        Picture1 = New Bitmap(Pfad_Bild)

        PictureBox1.Image = Picture1
        It_is_allowed_to_draw = True
        
    End Sub

And this is the code for my graphics class

Imports System.Drawing.Drawing2D
Public NotInheritable Class AllesGrafische
    Public Shared Sub Paint_the_Rectangle(ByVal g As Graphics, ByVal recta As Rectangle)
        If g IsNot Nothing Then
            g.SmoothingMode = SmoothingMode.AntiAlias
            g.CompositingQuality = CompositingQuality.HighQuality
            g.PixelOffsetMode = PixelOffsetMode.HighQuality
            g.InterpolationMode = InterpolationMode.HighQualityBilinear
            Using Pen_Hellblau As Pen = New Pen(Color.FromArgb(0, 200, 255), 1.0F)
                g.DrawRectangle(Pen_Hellblau, recta)
            End Using
        End If
    End Sub
End Class

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Set a Boolean field to True on the MouseDown event and then only act on the MouseUp if that flag is set.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...