Etwas auf einer halbdurchsichtigen Form ausschneiden und weiter verwenden

  • VB.NET

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

    @RushDen

    Ja bei Opacity 100 wird dir ja auch die Form angezeigt und die ist dann ja Gray.

    @ThuCommix

    Meinst du das etwa so ?:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Me.Opacity = 0
    4. Using bmp As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
    5. Dim gr As Graphics = Graphics.FromImage(bmp)
    6. gr.CopyFromScreen(0, 0, 0, 0, bmp.Size)
    7. Me.BackgroundImageLayout = ImageLayout.Stretch
    8. Me.BackgroundImage = bmp.Clone
    9. gr.Dispose()
    10. SettingsBefore()
    11. Me.Opacity = 100
    12. End Using
    13. End Sub
    14. Sub SettingsBefore()
    15. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    16. Me.Location = New Point(0, 0)
    17. Me.Size = My.Computer.Screen.Bounds.Size
    18. End Sub
    19. End Class

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

    Nun auf der Form ausschneiden

    Nun habe ich es so gemacht wie @ThuCommix es gesagt hat ich habe den Bildschirm komplett fotografiert und es als BackgroundImage auf der Form gemacht:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Me.Opacity = 0
    4. Me.BackgroundImage = MakeScreenShot()
    5. Me.Opacity = 100
    6. frmMain.Show()
    7. frmMain.TopMost = True
    8. End Sub
    9. Private Function MakeScreenShot() As Bitmap
    10. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    11. Dim Bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    12. Using Gra As Graphics = Graphics.FromImage(Bmp)
    13. Gra.CopyFromScreen(0, 0, 0, 0, Bmp.Size)
    14. End Using
    15. Return Bmp
    16. End Function
    17. End Class


    Nun will ich das der User da auf der Form das ausschneiden kann wie stell ich das am besten an ?

    Unten ein Bild wie es aktuell aussieht.

    Greet iEi
    Bilder
    • aktuell.png

      118,2 kB, 1.365×767, 94 mal angesehen

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

    Naja du lässt den User zweimal klicken und speicherst dann in zwei Points:

    Rectangle.X = P1.X
    Rectangle.Y = P1.Y
    Rectangle.Width = P2.X-P1.X
    Rectangle.Height= P2.Y-P1.Y

    Mit hilfe von GDI kannst du nun das Rectangle in einer Bitmap speichern.

    8-) faxe1008 8-)
    So sieht mein Code nun aus nur es tut sich nix was mache ich falsch ?Kann mir jemand erklären was ich falsch mache?:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Private Sub AreaSelect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    3. Dim r As New Rectangle
    4. Dim p1 As New Point
    5. Dim p2 As New Point
    6. r.X = p1.X
    7. r.Y = p1.Y
    8. r.Width = p2.X - p1.Y
    9. r.Height = p2.Y - p1.X
    10. End Sub
    11. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. Me.Opacity = 0
    13. Me.BackgroundImage = MakeScreenShot()
    14. Me.Opacity = 100
    15. frmMain.Show()
    16. frmMain.TopMost = True
    17. End Sub
    18. Private Function MakeScreenShot() As Bitmap
    19. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    20. Dim Bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    21. Using Gra As Graphics = Graphics.FromImage(Bmp)
    22. Gra.CopyFromScreen(0, 0, 0, 0, Bmp.Size)
    23. End Using
    24. Return Bmp
    25. End Function
    26. End Class
    Du brauchst auch noch ein Variable die dir speichert wie oft der User geklickt hat...

    VB.NET-Quellcode

    1. Public Sub ReturnSelRect()
    2. Select Case Often
    3. Case 0
    4. cut_rect.X = Pt.X
    5. cut_rect.Y = Pt.Y
    6. Often = 1
    7. Return
    8. Case 1
    9. cut_rect.Width = Pt.X - cut_rect.X
    10. cut_rect.Height = Pt.Y - cut_rect.Y
    11. End Select
    12. End Sub
    13. Private Sub Form2_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    14. Pt = e.Location
    15. End Sub
    16. Dim Often As Integer = 0
    17. Dim Pt As Point
    18. Dim cut_rect As Rectangle

    8-) faxe1008 8-)

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Dim cut_rect As Rectangle
    3. Dim Often As Integer = 0
    4. Dim Pt As Point
    5. Public Sub ReturnSelRect()
    6. Select Case Often
    7. Case 0
    8. cut_rect.X = Pt.X
    9. cut_rect.Y = Pt.Y
    10. Often = 1
    11. Return
    12. Case 1
    13. cut_rect.Width = Pt.X - cut_rect.X
    14. cut_rect.Height = Pt.Y - cut_rect.Y
    15. End Select
    16. End Sub
    17. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    18. Me.Opacity = 0
    19. Me.BackgroundImage = MakeScreenShot()
    20. Me.Opacity = 100
    21. frmMain.Show()
    22. frmMain.TopMost = True
    23. End Sub
    24. Private Function MakeScreenShot() As Bitmap
    25. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    26. Dim Bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    27. Using Gra As Graphics = Graphics.FromImage(Bmp)
    28. Gra.CopyFromScreen(0, 0, 0, 0, Bmp.Size)
    29. End Using
    30. Return Bmp
    31. End Function
    32. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    33. Pt = e.Location
    34. End Sub
    35. End Class


    Deins habe ich zum testen kurz kopiert ;)
    Ich hoffe ich habe das jetzt so richtig gemacht aber es tut sich noch immer nix :(:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Dim cut_rect As Rectangle
    3. Dim Often As Integer = 0
    4. Dim Pt As Point
    5. Public Sub ReturnSelRect()
    6. Select Case Often
    7. Case 0
    8. cut_rect.X = Pt.X
    9. cut_rect.Y = Pt.Y
    10. Often = 1
    11. Return
    12. Case 1
    13. cut_rect.Width = Pt.X - cut_rect.X
    14. cut_rect.Height = Pt.Y - cut_rect.Y
    15. End Select
    16. End Sub
    17. Private Sub AreaSelect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    18. ReturnSelRect()
    19. End Sub
    20. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    21. Me.Opacity = 0
    22. Me.BackgroundImage = MakeScreenShot()
    23. Me.Opacity = 100
    24. frmMain.Show()
    25. frmMain.TopMost = True
    26. End Sub
    27. Private Function MakeScreenShot() As Bitmap
    28. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    29. Dim Bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    30. Using Gra As Graphics = Graphics.FromImage(Bmp)
    31. Gra.CopyFromScreen(0, 0, 0, 0, Bmp.Size)
    32. End Using
    33. Return Bmp
    34. End Function
    35. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    36. Pt = e.Location
    37. End Sub
    38. End Class

    VB.NET-Quellcode

    1. Public Sub ReturnSelRect()
    2. Select Case Often
    3. Case 0
    4. cut_rect.X = Pt.X
    5. cut_rect.Y = Pt.Y
    6. Often = 1
    7. Return
    8. Case 1
    9. cut_rect.Width = Pt.X - cut_rect.X
    10. cut_rect.Height = Pt.Y - cut_rect.Y
    11. ' !!!!!!!!! Hier musst das Rectangle natürlich auch noch verwendet werden und die entstandene Bitmap an die Hauptform zurückschicken !!!!!!!!!!!!
    12. End Select
    13. End Sub

    8-) faxe1008 8-)
    Jetzt bekommt ich einen Fehler bei folgendem Code^^:

    VB.NET-Quellcode

    1. Public Class AreaSelect
    2. Dim cut_rect As Rectangle
    3. Dim Often As Integer = 0
    4. Dim Pt As Point
    5. Dim bitmap As Bitmap
    6. Public Sub ReturnSelRect()
    7. Select Case Often
    8. Case 0
    9. cut_rect.X = Pt.X
    10. cut_rect.Y = Pt.Y
    11. Often = 1
    12. Return
    13. Case 1
    14. cut_rect.Width = Pt.X - cut_rect.X
    15. cut_rect.Height = Pt.Y - cut_rect.Y
    16. CopyImage(bitmap, cut_rect)
    17. End Select
    18. End Sub
    19. Private Sub AreaSelect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
    20. ReturnSelRect()
    21. End Sub
    22. Private Sub AreaSelect_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    23. Me.Opacity = 0
    24. Me.BackgroundImage = MakeScreenShot()
    25. Me.Opacity = 100
    26. frmMain.Show()
    27. frmMain.TopMost = True
    28. End Sub
    29. Private Function MakeScreenShot() As Bitmap
    30. Dim Rect As Rectangle = Screen.PrimaryScreen.Bounds
    31. Dim Bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
    32. Using Gra As Graphics = Graphics.FromImage(Bmp)
    33. Gra.CopyFromScreen(0, 0, 0, 0, Bmp.Size)
    34. End Using
    35. Return Bmp
    36. End Function
    37. Private Sub AreaSelect_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    38. Pt = e.Location
    39. End Sub
    40. Overloads Shared Function CopyImage(ByVal srcBitmap As Bitmap, ByVal section As Rectangle) As Bitmap
    41. Dim bmp As New Bitmap(section.Width, section.Height)
    42. Dim g As Graphics = Graphics.FromImage(bmp)
    43. g.DrawImage(srcBitmap, 0, 0, section, GraphicsUnit.Pixel)
    44. g.Dispose()
    45. Return bmp
    46. End Function
    47. End Class
    Bilder
    • fehler2.png

      129,67 kB, 1.365×767, 99 mal angesehen
    Tust du nur so begriffsstuzig oder ist das Ernst (Quick&VeryDirty):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Kopiere()
    4. End Sub
    5. Sub Kopiere()
    6. Me.Opacity = 0
    7. Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Size.Width, Screen.PrimaryScreen.Bounds.Size.Height)
    8. Dim g As Graphics = Graphics.FromImage(bmp)
    9. g.CopyFromScreen(0, 0, 0, 0, bmp.Size)
    10. Dim frmer As New Form2
    11. frmer.Show(Me)
    12. frmer.BackgroundImage = bmp
    13. End Sub
    14. End Class


    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Click(sender As Object, e As EventArgs) Handles Me.Click
    3. ReturnSelRect()
    4. End Sub
    5. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Me.Size = My.Computer.Screen.Bounds.Size
    7. Me.CenterToScreen()
    8. End Sub
    9. Dim Often As Integer = 0
    10. Dim Pt As Point
    11. Dim cut_rect As Rectangle
    12. Public Sub ReturnSelRect()
    13. Select Case Often
    14. Case 0
    15. cut_rect.X = Pt.X
    16. cut_rect.Y = Pt.Y
    17. Often = 1
    18. Return
    19. Case 1
    20. cut_rect.Width = Pt.X - cut_rect.X
    21. cut_rect.Height = Pt.Y - cut_rect.Y
    22. Form1.Opacity = 100
    23. Form1.PictureBox1.Image = Copy(Me.BackgroundImage, cut_rect)
    24. Me.Close()
    25. End Select
    26. End Sub
    27. Public Overloads Shared Function Copy(srcBitmap As Bitmap, _
    28. section As Rectangle) As Bitmap
    29. ' Create the new bitmap and associated graphics object
    30. Dim bmp As New Bitmap(section.Width, section.Height)
    31. Dim g As Graphics = Graphics.FromImage(bmp)
    32. ' Draw the specified section of the source bitmap to the new one
    33. g.DrawImage(srcBitmap, 0, 0, section, GraphicsUnit.Pixel)
    34. ' Clean up
    35. g.Dispose()
    36. ' Return the bitmap
    37. Return bmp
    38. End Function
    39. Private Sub Form2_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
    40. Pt = e.Location
    41. End Sub
    42. End Class

    8-) faxe1008 8-)
    Ich bekomme trotzdem den Fehler im Click-Event
    Und bei Dim bmp As New Bitmap(section.Width, section.Height)
    Und bei Form1.PictureBox1.Image = Copy(Me.BackgroundImage, cut_rect) bei mir angepasst.
    Der Fehler ist noch immer Ungültiger Parameter.

    Falls du fragst bei mir ist frmMain nur eine ControlBox darin wird nix übergeben das wird in eine andere Form mit dem Namen frmIsScreenshotMake dort kann der Nutzer dann noch einen Text hinzufügen etc.

    Fehler gefunden!
    Es war das Problem ich habe immer über die Oberfläche gezogen anstatt zwei Punkte auszuwählen^^
    Bilder
    • da.png

      688,56 kB, 1.028×487, 88 mal angesehen

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

    Für den nun folgenden Spruch möcht ich mir am liebsten mit dem Hammer auf den Kopf schlagen:
    Kopier den Kram den ich verzapft habe so wie er da steht mal in ein extra Projekt. Setze Haltepunkte, vollziehs nach baus in dein Hauptprojekt!

    8-) faxe1008 8-)