Etwas auf einer halbdurchsichtigen Form ausschneiden und weiter verwenden

  • VB.NET

Es gibt 54 Antworten in diesem Thema. Der letzte Beitrag () ist von ThuCommix.

    Etwas auf einer halbdurchsichtigen Form ausschneiden und weiter verwenden

    Hey Com,

    ich habe da unten auf dem Bild eine Form im Hintergrund mit Opacity=50.
    Nun möchte ich das die Form "ausgeschnitten" werden kann also der User bei ziehen der Maus(MouseDown) einen Bereich ausschneiden kann und ihn dann weiter verwenden kann.Was wäre da die beste Methode ? Einfach ein Rectangle zeichnen und da wo das Rectangle dann gezeichnet wird die Opacity auf 0 stellen oder gibt es da eine andere Methode ?

    Greet iEi
    Bilder
    • ausschneiden.png

      92,52 kB, 1.365×767, 309 mal angesehen
    Die einfachste Methode wäre es wenn du das so machst:

    1. Hauptform Opacity auf 0
    2. gesammten Screen aufnehmen und als Hintergrdund der zweiten Form nehmen
    3. 2Form maximieren und zentrieren
    4. Rectangle durch zwei Mausklicke festlegen
    5. Teil "ausschneiden" und in der ersten Form anzeigen + 1Form Opacity wieder auf 100

    => Fertig

    8-) faxe1008 8-)
    Die Frage ist wie ich nur ein Kästchen auf das Bild kriege also da wo der User MouseDown macht also anfängt zu "ziehen" hier mein Code für das Fadenkreuz:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private pt As Point
    3. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    4. pt = e.Location
    5. Me.Invalidate()
    6. End Sub
    7. Private Sub AreaSelect_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    8. Dim g = e.Graphics
    9. g.DrawLine(Pens.Black, 0, pt.Y, Me.Width, pt.Y)
    10. g.DrawLine(Pens.Black, pt.X, 0, pt.X, Me.Height)
    11. End Sub
    12. End Class
    Ich würde das folgendermaßen machen: Screenshot des gesamten Bildschirmes machen und als Formhintergrund festlegen. Danach noch mit GDI die Auswahl machen und den Screenshot passend zuschneiden.
    Naja ich möchte den User schon auswählen lassen was er ausschneiden will deshalb ja auch im MouseDown-Event.Ich muss ja nur ein Rectangle zeichnen und zwar dort wo der User anfängt bis dahin wo er aufhört.Die Frage ist halt wie ich das umsetzen kann weil es gibt bei Rectangle kein StartPoint etc. ^^

    EDIT://
    Hab nun etwas gefunden was mir hilft^^
    Und zwar so:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private pt As Point
    3. Dim r As Rectangle = Nothing
    4. Private Sub AreaSelect_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    5. If Not e.Button = Windows.Forms.MouseButtons.Left Then Return
    6. r = New Rectangle(e.X, e.Y, 0, 0)
    7. Me.Invalidate()
    8. End Sub
    9. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    10. If r = Nothing Then Return
    11. r = New Rectangle(r.X, r.Y, e.X - r.X, e.Y - r.Y) ' neue Positionen
    12. Me.Invalidate() ' zeichnen
    13. End Sub
    14. Private Sub AreaSelect_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    15. r = Nothing
    16. Me.Invalidate()
    17. End Sub
    18. Private Sub AreaSelect_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    19. If r = Nothing Then Return
    20. Dim pr As New Rectangle(r.Location, r.Size)
    21. If pr.Width < 0 Then pr = New Rectangle(pr.X + pr.Width, pr.Y, -pr.Width, pr.Height)
    22. If pr.Height < 0 Then pr = New Rectangle(pr.X, pr.Y + pr.Height, pr.Width, -pr.Height)
    23. Using Pen As New Pen(Color.Black)
    24. e.Graphics.DrawRectangle(Pen, pr)
    25. End Using
    26. End Sub
    27. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „iEi“ ()

    Das aus dem Rectangle zu einer Bitmap umwandeln

    So nun das funktioniert supi !
    Nur hackt es jetzt und zwar möchte ich das Bild aus dem Rectangle also das was im Rectangle ist als Bitmap speichern nur leider komm ich da nicht weiter.
    Ich habe es bereits im Paint-Event so getestet doch da kommt der Fehler Ungültiger Parameter:

    VB.NET-Quellcode

    1. Private Sub AreaSelect_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. If r = Nothing Then Return
    3. Dim pr As New Rectangle(r.Location, r.Size)
    4. If pr.Width < 0 Then pr = New Rectangle(pr.X + pr.Width, pr.Y, -pr.Width, pr.Height)
    5. If pr.Height < 0 Then pr = New Rectangle(pr.X, pr.Y + pr.Height, pr.Width, -pr.Height)
    6. Dim bmp As New Bitmap(pr.Width, pr.Height) 'Hier kommt der Fehler
    7. Using Pen As New Pen(Color.Black)
    8. e.Graphics.DrawRectangle(Pen, pr)
    9. bmp.Save("test.jpg")
    10. End Using
    11. End Sub

    Mein ganzer Code ist hier: [VB 2010] Etwas auf einer halbdurchsichtigen Form ausschneiden und weiter verwenden
    Das Problem ist, dass keine negativen Punkte sein dürfen. Probier mal das:

    VB.NET-Quellcode

    1. Private Sub AreaSelect_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    2. If r = Nothing Then Return
    3. Dim pr As New Rectangle(r.Location, r.Size)
    4. If pr.Width < 0 Then pr = New Rectangle(pr.X + pr.Width, pr.Y, -pr.Width, pr.Height) Else Return
    5. If pr.Height < 0 Then pr = New Rectangle(pr.X, pr.Y + pr.Height, pr.Width, -pr.Height) Else Return
    6. Dim bmp As New Bitmap(pr.Width, pr.Height) 'pr.Width oder pr.Height sind im negativen Bereich. Darum der Fehler
    7. Using Pen As New Pen(Color.Black)
    8. e.Graphics.DrawRectangle(Pen, pr)
    9. bmp.Save("test.jpg")
    10. End Using
    11. End Sub
    12. End Class


    Hier gehts zwar wenn du die Maus drückst und dann nach links oder oben ziehst, andersrum jedoch nicht.
    Bei mir schon..


    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private pt As Point
    3. Dim r As Rectangle = Nothing
    4. Private Sub AreaSelect_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
    5. If Not e.Button = Windows.Forms.MouseButtons.Left Then Return
    6. r = New Rectangle(e.X, e.Y, 0, 0)
    7. Me.Invalidate()
    8. End Sub
    9. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    10. If r = Nothing Then Return
    11. r = New Rectangle(r.X, r.Y, e.X - r.X, e.Y - r.Y) ' neue Positionen
    12. Me.Invalidate() ' zeichnen
    13. End Sub
    14. Private Sub AreaSelect_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
    15. r = Nothing
    16. Me.Invalidate()
    17. End Sub
    18. Private Sub AreaSelect_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    19. If r = Nothing Then Return
    20. Dim pr As New Rectangle(r.Location, r.Size)
    21. If pr.Width < 0 Then pr = New Rectangle(pr.X + pr.Width, pr.Y, -pr.Width, pr.Height) Else Return
    22. If pr.Height < 0 Then pr = New Rectangle(pr.X, pr.Y + pr.Height, pr.Width, -pr.Height) Else Return
    23. Dim bmp As New Bitmap(pr.Width, pr.Height) 'Hier kommt der Fehler
    24. Using Pen As New Pen(Color.Black)
    25. e.Graphics.DrawRectangle(Pen, pr)
    26. bmp.Save("test.jpg")
    27. End Using
    28. End Sub
    29. End Class


    Nimm mal deinen Desktop als Pfad und probier ob's dann gespeichert wird.