Bildausschnitt in PB verschieben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Bildausschnitt in PB verschieben

    Moin,

    irgendwie stehe ich herade ratlos da, ich habe eine PB in der ich ein Bild lade und dieses möchte ich dann mit der Maus verschieben, sofern das Bild größer als die PB ist.
    Das funktioniert auch bereits super. Nun möchte ich jedoch, dass man das Bild nicht über die Maximalmaße schieben kann, also wenn die rechte Seite erreicht ist, soll man nicht weiter schieben können, ebenso beim unteren Ende.
    Oben und Links habe ich bereits einfach hinbekommen.

    Hier erstmal mein Code

    Global

    VB.NET-Quellcode

    1. Private bButtonPressed As Boolean = False
    2. Private MousePos As Point
    3. Private PicPos As New Point(0, 0)
    4. Private CurrentPos As Point
    5. Private BigPicture As Bitmap ' das geladene Hauptbild


    VB.NET-Quellcode

    1. Private Sub imgHeader_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles imgHeader.MouseDown
    2. Dim This As PictureBox = TryCast(sender, PictureBox)
    3. If Not bButtonPressed AndAlso e.Button = Windows.Forms.MouseButtons.Left Then
    4. bButtonPressed = True
    5. MousePos = New Point(Cursor.Position.X - PicPos.X, Cursor.Position.Y - PicPos.Y)
    6. End If
    7. End Sub
    8. Private Sub imgHeader_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles imgHeader.MouseMove
    9. Dim This As PictureBox = TryCast(sender, PictureBox)
    10. If bButtonPressed Then
    11. Dim bNew As New Bitmap(This.Width, This.Height)
    12. Dim g As Graphics = Graphics.FromImage(bNew)
    13. If BigPicture.Width - This.Width > 0 Then
    14. If Cursor.Position.X - MousePos.X < 0 Then CurrentPos.X = Cursor.Position.X - MousePos.X
    15. End If
    16. If BigPicture.Height - This.Height > 0 Then
    17. If Cursor.Position.Y - MousePos.Y < 0 Then CurrentPos.Y = Cursor.Position.Y - MousePos.Y
    18. End If
    19. g.DrawImage(BigPicture, CurrentPos)
    20. g.Dispose()
    21. This.Image = bNew
    22. End If
    23. End Sub
    24. Private Sub imgHeader_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles imgHeader.MouseUp
    25. If bButtonPressed AndAlso e.Button = Windows.Forms.MouseButtons.Left Then
    26. PicPos = New Point(CurrentPos.X, CurrentPos.Y)
    27. End If
    28. bButtonPressed = False
    29. End Sub


    Wenn ich nun ein Bildlade welches z.B. bei Abmaße 1280x1024 hat und mir die Position des Bildausschnitts anzeigen lasse, so hat CurPos.X den Wert 1218 wenn das Bild am rechten Rand der PB angelangt ist. Meine Frage ist nun, wie komme ich mathematisch auf diesen Wert?
    PS: Die PB hat die Abmaße 490x68.
    Es sollte so gehen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub imgHeader_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles imgHeader.MouseMove
    2. Dim This As PictureBox = TryCast(sender, PictureBox)
    3. If bButtonPressed Then
    4. Dim bNew As New Bitmap(This.Width, This.Height)
    5. Dim g As Graphics = Graphics.FromImage(bNew)
    6. If BigPicture.Width - This.Width > 0 Then
    7. If Cursor.Position.X - MousePos.X < 0 Then CurrentPos.X = Cursor.Position.X - MousePos.X
    8. End If
    9. If BigPicture.Height - This.Height > 0 Then
    10. If Cursor.Position.Y - MousePos.Y < 0 Then CurrentPos.Y = Cursor.Position.Y - MousePos.Y
    11. End If
    12. If (CurrentPos.X < This.Width - BigPicture.Width) Then
    13. CurrentPos.X = This.Width - BigPicture.Width
    14. End If
    15. If (CurrentPos.Y < This.Height - BigPicture.Height) Then
    16. CurrentPos.Y = This.Height - BigPicture.Height
    17. End If
    18. g.DrawImage(BigPicture, CurrentPos)
    19. g.Dispose()
    20. This.Image = bNew
    21. End If
    22. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei mir ist alles da.
    Hast Du noch irgendwo einen Rand?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was für ein Rand??

    Also diese Formel macht ja auch Sinn, aber funktioniert bei mir eben nicht ^^ wie gesagt das Bild mit 1280px Breite ist bei 1218px genau am rechten Rand der PB.
    1280 - 490 = 790 das heißt es fehlt vom Bild noch eine ganze Menge.

    Ein Bild mit der Breite von 790px ist bei CurrentPos.X = 302 am rechten Rand.
    Ich seh gerade, hab auch ein großes Bild drin, da scheint CurrentPos irgendwie beschnitten zu sein. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du verwendest

    VB.NET-Quellcode

    1. Cursor.Position.X
    2. Cursor.Position.Y
    3. ' anstelle
    4. e.X
    5. e.Y

    Isses das vielleicht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    zieht e.x und e.y nicht NUR wenn sich die Maus auf der PB befindet? Ich will aber die globalen Mauskoordinaten haben, damit ich die Maus im gedrücken Zustand übern gesamten Bildschirm bewegen kann um das Bild zu verschieben.

    An der Position liegt es ja nicht, die korrekte Position bekomme ich ja indem ich den Klickpunkt ebenfalls mitspeichere und das passt auch, da sich das Bild identisch mit der Maus mitbewegt, als wäre die Maus fest auf dem Bild verankert. Würde da was nicht stimmen würde sich das Bild unabhängig von der Mausbewegen, schneller oder langsamer.