Snipping Tool zeichnet extrem langsam

  • VB.NET
  • .NET (FX) 4.0

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Blackn0va.

    Snipping Tool zeichnet extrem langsam

    Hallo,

    ich bin gerade dabei ein kleines Tool zu schreiben, dieses tool i st eine Trayapp, mithilfe dieser app kann man ein Support Ticket erstellen und ein Screenshot anfügen.
    Nun zu meinem Problem, das Zeichnen Funktioniert, also das Markieren mit der maus, aber es ist extrem langsam, mit:

    VB.NET-Quellcode

    1. Me.DoubleBuffered = True

    Funktioniert es leider nicht, hat irgend jemand eine Idee dazu? Hier der Code vom Snipping.vb


    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SnippingTool
    2. Private Shared _Screen As Screen
    3. Private Shared BitmapSize As Size
    4. Private Shared Graph As Graphics
    5. Private Structure MultiScreenSize
    6. Dim minX As Integer
    7. Dim minY As Integer
    8. Dim maxRight As Integer
    9. Dim maxBottom As Integer
    10. End Structure
    11. Private Shared Function FindMultiScreenSize() As MultiScreenSize
    12. Dim minX As Integer = Screen.AllScreens(0).Bounds.X
    13. Dim minY As Integer = Screen.AllScreens(0).Bounds.Y
    14. Dim maxRight As Integer = Screen.AllScreens(0).Bounds.Right
    15. Dim maxBottom As Integer = Screen.AllScreens(0).Bounds.Bottom
    16. For Each aScreen As Screen In Screen.AllScreens
    17. If aScreen.Bounds.X < minX Then
    18. minX = aScreen.Bounds.X
    19. End If
    20. If aScreen.Bounds.Y < minY Then
    21. minY = aScreen.Bounds.Y
    22. End If
    23. If aScreen.Bounds.Right > maxRight Then
    24. maxRight = aScreen.Bounds.Right
    25. End If
    26. If aScreen.Bounds.Bottom > maxBottom Then
    27. maxBottom = aScreen.Bounds.Bottom
    28. End If
    29. Next
    30. Dim m_MultiScreenSize As MultiScreenSize
    31. With m_MultiScreenSize
    32. .minX = minX
    33. .minY = minY
    34. .maxBottom = maxBottom
    35. .maxRight = maxRight
    36. End With
    37. Return m_MultiScreenSize
    38. End Function
    39. Public Shared Function Snip() As Image
    40. Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
    41. Dim bmp As New Bitmap(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
    42. m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY,
    43. System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    44. Dim gr As Graphics = Graphics.FromImage(bmp)
    45. Graph = gr
    46. gr.SmoothingMode = Drawing2D.SmoothingMode.None
    47. BitmapSize = bmp.Size
    48. Using snipper = New SnippingTool(bmp)
    49. snipper.Location = New Point(m_MultiScreenSize.minX, m_MultiScreenSize.minY)
    50. If snipper.ShowDialog() = DialogResult.OK Then
    51. Return snipper.Image
    52. End If
    53. End Using
    54. Return Nothing
    55. End Function
    56. Public Sub New(ByVal screenShot As Image)
    57. InitializeComponent()
    58. Me.DoubleBuffered = True
    59. Me.BackgroundImage = screenShot
    60. 'Me.BackgroundImageLayout = ImageLayout.None
    61. Me.ShowInTaskbar = False
    62. Me.StartPosition = FormStartPosition.Manual
    63. Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center
    64. End Sub
    65. Public Property Image() As Image
    66. Get
    67. Return m_Image
    68. End Get
    69. Set(ByVal value As Image)
    70. m_Image = value
    71. End Set
    72. End Property
    73. Private m_Image As Image
    74. Private rcSelect As New Rectangle()
    75. Private pntStart As Point
    76. Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
    77. '*** Start Snip bei MausUp
    78. If e.Button <> MouseButtons.Left Then
    79. Return
    80. End If
    81. pntStart = e.Location
    82. rcSelect = New Rectangle(e.Location, New Size(0, 0))
    83. Me.Invalidate()
    84. End Sub
    85. Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
    86. '*** Modiviziere die Selection ***
    87. If e.Button <> MouseButtons.Left Then
    88. Return
    89. End If
    90. Dim x1 As Integer = Math.Min(e.X, pntStart.X)
    91. Dim y1 As Integer = Math.Min(e.Y, pntStart.Y)
    92. Dim x2 As Integer = Math.Max(e.X, pntStart.X)
    93. Dim y2 As Integer = Math.Max(e.Y, pntStart.Y)
    94. rcSelect = New Rectangle(x1, y1, x2 - x1, y2 - y1)
    95. Me.Invalidate()
    96. End Sub
    97. Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    98. '*** Bild Vervollständigen mit MouseUp ***
    99. If rcSelect.Width <= 0 OrElse rcSelect.Height <= 0 Then
    100. Return
    101. End If
    102. Image = New Bitmap(rcSelect.Width, rcSelect.Height)
    103. Using gr As Graphics = Graphics.FromImage(Image)
    104. gr.DrawImage(Me.BackgroundImage, New Rectangle(0, 0, Image.Width, Image.Height),
    105. rcSelect, GraphicsUnit.Pixel)
    106. End Using
    107. DialogResult = DialogResult.OK
    108. End Sub
    109. Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    110. '*** Zeichnet die aktuelle auswahl ***'
    111. Using br As Brush = New SolidBrush(Color.FromArgb(120, Color.White))
    112. Dim x1 As Integer = rcSelect.X
    113. Dim x2 As Integer = rcSelect.X + rcSelect.Width
    114. Dim y1 As Integer = rcSelect.Y
    115. Dim y2 As Integer = rcSelect.Y + rcSelect.Height
    116. e.Graphics.FillRectangle(br, New Rectangle(0, 0, x1, Me.Height))
    117. e.Graphics.FillRectangle(br, New Rectangle(x2, 0, Me.Width - x2, Me.Height))
    118. e.Graphics.FillRectangle(br, New Rectangle(x1, 0, x2 - x1, y1))
    119. e.Graphics.FillRectangle(br, New Rectangle(x1, y2, x2 - x1, Me.Height - y2))
    120. End Using
    121. Using pen As New Pen(Color.Red, 3)
    122. e.Graphics.DrawRectangle(pen, rcSelect)
    123. End Using
    124. End Sub
    125. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    126. '*** Erlaubt das abbrechen miit der Escape Taste ***
    127. If keyData = Keys.Escape Then
    128. Me.DialogResult = DialogResult.Cancel
    129. End If
    130. Return MyBase.ProcessCmdKey(msg, keyData)
    131. End Function
    132. Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    133. MyBase.OnLoad(e)
    134. Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
    135. Me.Size = New Size(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
    136. m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY)
    137. Graph.CopyFromScreen(m_MultiScreenSize.minX, m_MultiScreenSize.minY, 0, 0, BitmapSize)
    138. End Sub
    139. End Class



    Der Aufruf erfolgt mit

    VB.NET-Quellcode

    1. '*** Screenshot erzeugen ***
    2. Dim Bild As Image = SnippingTool.Snip()

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Blackn0va“ ()

    Also ich weiß jetzt das

    VB.NET-Quellcode

    1. InitializeComponent()

    schuld daran ist das es nicht DoubleGebuffert wird, lösche ich also die Zeile und mache noch die Me.FormBorderStyle = FormBorderStyle.None dann den DoubleBuffered auf true funktioniert es, aber das bringt bei jedem Start eine andere Überraschung mit sich.
    @Blackn0va
    Sieh Dir mal die Control.DrawToBitmap()-Methode an, damit wird üblicherweise ein Screenshot geholt.
    msdn.microsoft.com/de-de/libra…awtobitmap(v=vs.110).aspx
    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!
    Erstmal danke für die Antwort,

    nicht das ich es falsch verstehe.

    Ich habe eine Form für das snipping, das bei Active den gesamten desktop (2 monitore) auf eine milchige Form quasi kopiert, und mit der maus wähle ich den bereich aus den ich gespeichert haben möchte.

    Wo ist da dann g enau der unterschied zuControl.DrawToBitmap().

    Ich bin noch recht neu und tu mich noch ziehmlich schwer..


    Wie würde das dann in etwa aussehen?

    VB.NET-Quellcode

    1. Using pen As New Pen(Color.Red, 2)
    2. e.Graphics.DrawRectangle(pen, rcSelect)
    3. End Using


    VB.NET-Quellcode

    1. Public Sub DrawToBitmap (
    2. bitmap As Bitmap,
    3. rcSelect As Rectangle
    4. )


    iwie so ^

    @Blackn0va Sorry, falscher Befehl.
    Mit DrawToBitmap() kannst Du ein Control oder Deine Form fotografieren.
    Einen Screenshot machst Du mit Graphics.CopyFromScreen.
    Dieses Beispiel fotografiert den 1. und den 2. Screen am und speichert die Bilder im Temp-Verzeichnis:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    2. Dim bmp As Bitmap = Screenshot(0)
    3. bmp.Save("c:\Temp\Test0.png", System.Drawing.Imaging.ImageFormat.Png)
    4. bmp = Screenshot(1)
    5. bmp.Save("c:\Temp\Test1.png", System.Drawing.Imaging.ImageFormat.Png)
    6. End Sub
    7. Function Screenshot(index As Integer) As Bitmap
    8. Dim img As Bitmap
    9. Dim x0 As Integer
    10. If index = 0 Then
    11. ' Koordinaten des 1. Screens
    12. x0 = 0
    13. img = New Bitmap(Screen.AllScreens(0).WorkingArea.Width, Screen.AllScreens(0).WorkingArea.Height)
    14. Else
    15. ' Koordinaten des 2. Screens
    16. x0 = Screen.AllScreens(0).WorkingArea.Width
    17. img = New Bitmap(Screen.AllScreens(1).WorkingArea.Width, Screen.AllScreens(1).WorkingArea.Height)
    18. End If
    19. Using g As Graphics = Graphics.FromImage(img)
    20. g.CopyFromScreen(x0, 0, 0, 0, img.Size)
    21. g.Dispose()
    22. End Using
    23. Return img
    24. End Function

    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!
    aber ich möchte den ausschnitt mit der maus Zeichnen :)


    das zeichnen und die koordinaten mit der maus zu bestimmen klappt ja, es wird auch das bild verarbeitet und gespeichert, das problem ist, das die bewegung der maus, also wenn ich den ausschnitt mit der maus Markiere, das hackt wie die sau, da gehen nicht mehr wie 4fps (gefühlt).

    Blackn0va schrieb:

    aber ich möchte den ausschnitt mit der maus Zeichnen
    Aber dann musst Du an der Stelle, wo ich die Screen-Begrenzungen eintrage, einfach die Mauskoordinaten eintragen.
    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!
    @Blackn0va Vielleicht geht das so einfacher:
    Mach Dir eine Form, die fast durchsichtig ist (Parameter Opacity), und in der kannst Du dann mit den MouseDown und MouseUp-Events Deine Koordinaten festlegen.
    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!
    genau so hab ich das ja gemacht, aber er mekkert nur ..:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    2. '*** Bild Vervollständigen mit MouseUp ***
    3. If rcSelect.Width <= 0 OrElse rcSelect.Height <= 0 Then
    4. Return
    5. End If
    6. Image = New Bitmap(rcSelect.Width, rcSelect.Height)
    7. 'Using gr As Graphics = Graphics.FromImage(Image)
    8. ' gr.DrawImage(Me.BackgroundImage, New Rectangle(0, 0, Image.Width, Image.Height),
    9. ' rcSelect, GraphicsUnit.Pixel)
    10. 'End Using
    11. Using g As Graphics = Graphics.FromImage(Image)
    12. g.CopyFromScreen(0, 0, Image.Width, Image.Height, Image.Size)
    13. g.Dispose()
    14. End Using
    15. DialogResult = DialogResult.OK
    16. End Sub

    Blackn0va schrieb:

    aber er mekkert nur
    Welche Zeile?
    Welche Fehlermeldung?
    Wie ist Image deklariert?
    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!
    Also 8 -11 so funktioniert es aber wackelt wie sau, und 13 - 16 is die eben umgebaute version die nicht funktioniert.

    Ja das Image ist als Bitmap deklariert :whistling:


    Hier mal die ganze form

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SnippingTool
    2. Shadows Text As String
    3. Private Shared _Screen As Screen
    4. Private Shared BitmapSize As Size
    5. Private Shared Graph As Graphics
    6. Private Structure MultiScreenSize
    7. Dim minX As Integer
    8. Dim minY As Integer
    9. Dim maxRight As Integer
    10. Dim maxBottom As Integer
    11. End Structure
    12. Private Shared Function FindMultiScreenSize() As MultiScreenSize
    13. Dim minX As Integer = Screen.AllScreens(0).Bounds.X
    14. Dim minY As Integer = Screen.AllScreens(0).Bounds.Y
    15. Dim maxRight As Integer = Screen.AllScreens(0).Bounds.Right
    16. Dim maxBottom As Integer = Screen.AllScreens(0).Bounds.Bottom
    17. For Each aScreen As Screen In Screen.AllScreens
    18. If aScreen.Bounds.X < minX Then
    19. minX = aScreen.Bounds.X
    20. End If
    21. If aScreen.Bounds.Y < minY Then
    22. minY = aScreen.Bounds.Y
    23. End If
    24. If aScreen.Bounds.Right > maxRight Then
    25. maxRight = aScreen.Bounds.Right
    26. End If
    27. If aScreen.Bounds.Bottom > maxBottom Then
    28. maxBottom = aScreen.Bounds.Bottom
    29. End If
    30. Next
    31. Dim m_MultiScreenSize As MultiScreenSize
    32. With m_MultiScreenSize
    33. .minX = minX
    34. .minY = minY
    35. .maxBottom = maxBottom
    36. .maxRight = maxRight
    37. End With
    38. Return m_MultiScreenSize
    39. End Function
    40. Public Shared Function Snip() As Image
    41. Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
    42. Dim bmp As New Bitmap(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
    43. m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY,
    44. System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    45. Dim gr As Graphics = Graphics.FromImage(bmp)
    46. Graph = gr
    47. gr.SmoothingMode = Drawing2D.SmoothingMode.None
    48. BitmapSize = bmp.Size
    49. Using snipper = New SnippingTool(bmp)
    50. snipper.Location = New Point(m_MultiScreenSize.minX, m_MultiScreenSize.minY)
    51. If snipper.ShowDialog() = DialogResult.OK Then
    52. Return snipper.Image
    53. End If
    54. End Using
    55. Return Nothing
    56. End Function
    57. Public Sub New(ByVal screenShot As Image)
    58. InitializeComponent()
    59. Me.DoubleBuffered = True
    60. Me.BackgroundImage = screenShot
    61. 'Me.BackgroundImageLayout = ImageLayout.None
    62. Me.ShowInTaskbar = False
    63. Me.StartPosition = FormStartPosition.Manual
    64. Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center
    65. End Sub
    66. Public Property Image() As Image
    67. Get
    68. Return m_Image
    69. End Get
    70. Set(ByVal value As Image)
    71. m_Image = value
    72. End Set
    73. End Property
    74. Private m_Image As Image
    75. Private rcSelect As New Rectangle()
    76. Private pntStart As Point
    77. Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
    78. '*** Start Snip bei MausDown
    79. If e.Button <> MouseButtons.Left Then
    80. Return
    81. End If
    82. pntStart = e.Location
    83. rcSelect = New Rectangle(e.Location, New Size(0, 0))
    84. Me.DoubleBuffered = True
    85. Me.Invalidate()
    86. End Sub
    87. Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
    88. '*** Modiviziere die Selection ***
    89. If e.Button <> MouseButtons.Left Then
    90. Return
    91. End If
    92. Dim x1 As Integer = Math.Min(e.X, pntStart.X)
    93. Dim y1 As Integer = Math.Min(e.Y, pntStart.Y)
    94. Dim x2 As Integer = Math.Max(e.X, pntStart.X)
    95. Dim y2 As Integer = Math.Max(e.Y, pntStart.Y)
    96. rcSelect = New Rectangle(x1, y1, x2 - x1, y2 - y1)
    97. Me.Invalidate()
    98. End Sub
    99. Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    100. '*** Bild Vervollständigen mit MouseUp ***
    101. If rcSelect.Width <= 0 OrElse rcSelect.Height <= 0 Then
    102. Return
    103. End If
    104. Image = New Bitmap(rcSelect.Width, rcSelect.Height)
    105. 'Using gr As Graphics = Graphics.FromImage(Image)
    106. ' gr.DrawImage(Me.BackgroundImage, New Rectangle(0, 0, Image.Width, Image.Height),
    107. ' rcSelect, GraphicsUnit.Pixel)
    108. 'End Using
    109. Using g As Graphics = Graphics.FromImage(Image)
    110. g.CopyFromScreen(Me.BackgroundImage, New Graphics(0, 0, Image.Width, Image.Height, Image.Size))
    111. g.Dispose()
    112. End Using
    113. DialogResult = DialogResult.OK
    114. End Sub
    115. Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
    116. '*** Zeichnet die aktuelle auswahl ***'
    117. Using br As Brush = New SolidBrush(Color.FromArgb(120, Color.White))
    118. Dim x1 As Integer = rcSelect.X
    119. Dim x2 As Integer = rcSelect.X + rcSelect.Width
    120. Dim y1 As Integer = rcSelect.Y
    121. Dim y2 As Integer = rcSelect.Y + rcSelect.Height
    122. e.Graphics.FillRectangle(br, New Rectangle(0, 0, x1, Me.Height))
    123. e.Graphics.FillRectangle(br, New Rectangle(x2, 0, Me.Width - x2, Me.Height))
    124. e.Graphics.FillRectangle(br, New Rectangle(x1, 0, x2 - x1, y1))
    125. e.Graphics.FillRectangle(br, New Rectangle(x1, y2, x2 - x1, Me.Height - y2))
    126. End Using
    127. '*** Wír zeichnen mit der Maus mit einem 2px Breiten Stift das gwünschte Bild
    128. Using pen As New Pen(Color.Red, 2)
    129. e.Graphics.DrawRectangle(pen, rcSelect)
    130. End Using
    131. End Sub
    132. Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    133. '*** Erlaubt das abbrechen miit der Escape Taste ***
    134. If keyData = Keys.Escape Then
    135. Me.DialogResult = DialogResult.Cancel
    136. End If
    137. Return MyBase.ProcessCmdKey(msg, keyData)
    138. End Function
    139. Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    140. MyBase.OnLoad(e)
    141. Dim m_MultiScreenSize As MultiScreenSize = FindMultiScreenSize()
    142. Me.Size = New Size(m_MultiScreenSize.maxRight - m_MultiScreenSize.minX,
    143. m_MultiScreenSize.maxBottom - m_MultiScreenSize.minY)
    144. Graph.CopyFromScreen(m_MultiScreenSize.minX, m_MultiScreenSize.minY, 0, 0, BitmapSize)
    145. End Sub
    146. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    147. '*** Label nach 5 Sekunden ausblenden ***
    148. Me.Label1.Text = ""
    149. Me.Label1.Enabled = False
    150. End Sub
    151. End Class




    Dabei glaube ich das es an Zeile 82/83 liegt, denn, sobald ich die Form initialisiere mit

    VB.NET-Quellcode

    1. InitializeComponent()


    funktioniert das DoubleBuffered nicht mehr. Komentiere ich es aus also die initialisierung funktioniert douublebuffered.. iwo is der Wurm drinne

    Nach dem das Bild gemacht wirde, wird in einer weiteren box das Bild in klein Vorgestellt und der User entscheidet sich für dieses Bild oder er macht ein neues, erst dann wird gespeichert, und die email generiert.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Blackn0va“ ()

    Blackn0va schrieb:

    Also 8 -11 so funktioniert es aber wackelt wie sau, und 13 - 16 is die eben umgebaute version die nicht funktioniert.
    Worauf beziehen sich die Zahlen?
    Mit InitializeComponent() wird die GUI erstellt.
    ===
    Wenn Du viel Quelltext postest, mach da bitte einen drumherum.
    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!
    auf den hier :) sorry

    Blackn0va schrieb:

    genau so hab ich das ja gemacht, aber er mekkert nur ..:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    2. '*** Bild Vervollständigen mit MouseUp ***
    3. If rcSelect.Width <= 0 OrElse rcSelect.Height <= 0 Then
    4. Return
    5. End If
    6. Image = New Bitmap(rcSelect.Width, rcSelect.Height)
    7. 'Using gr As Graphics = Graphics.FromImage(Image)
    8. ' gr.DrawImage(Me.BackgroundImage, New Rectangle(0, 0, Image.Width, Image.Height),
    9. ' rcSelect, GraphicsUnit.Pixel)
    10. 'End Using
    11. Using g As Graphics = Graphics.FromImage(Image)
    12. g.CopyFromScreen(0, 0, Image.Width, Image.Height, Image.Size)
    13. g.Dispose()
    14. End Using
    15. DialogResult = DialogResult.OK
    16. End Sub

    Blackn0va schrieb:

    VB.NET-Quellcode

    1. g.Dispose()
    kannste streichen, dafür ist das Using da.
    Ansonsten sehe ich da keinen funktionalen Unterschied.
    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!

    Blackn0va schrieb:

    project zukommen lassen
    Klar, hänge es, bereinigt (ohne bin- und obj-Ordner) als ZIP an Deinen Post.
    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!
    Guten Morgen allerseitz :)

    Aslo ich hab das jetzt mal mit FillRegion versucht, aber das Wackelt genau so, vlt hab ich es auch falsch gemacht, was ich eher glaube :)

    VB.NET-Quellcode

    1. Dim fillRect As New Rectangle(x1, y1, x2, y2)
    2. Dim fillRegion As New [Region](fillRect)
    3. '*** Fillregion würde hier besser passen
    4. e.Graphics.FillRegion(br, fillRegion)


    wie würdet ihr das FillRectangle in FillRegion umschreiben?

    '*Alt

    VB.NET-Quellcode

    1. e.Graphics.FillRectangle(br, New Rectangle(0, 0, x1, Me.Height))
    2. e.Graphics.FillRectangle(br, New Rectangle(x2, 0, Me.Width - x2, Me.Height))
    3. e.Graphics.FillRectangle(br, New Rectangle(x1, 0, x2 - x1, y1))
    4. e.Graphics.FillRectangle(br, New Rectangle(x1, y2, x2 - x1, Me.Height - y2))


    '*Neu

    VB.NET-Quellcode

    1. e.Graphics.FillRegion(br, New Rectangle(x1, y1, x2, y2) ? Funktioniert leider nicht.


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

    Blackn0va schrieb:

    wie würdet ihr das FillRectangle in FillRegion umschreiben?
    Gar nicct.
    Erstell eine Region mit dem vollen Rechteck und exclude dann das kleine Rechteck.

    VB.NET-Quellcode

    1. Dim reg = New System.Drawing.Region(DEIN_GROSSES_RECHTECK)
    2. reg.Exclude(DEIN_KLEINES_RECHTECK)
    3. e.Graphics.FillRegion(br, reg)
    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!
    Moin :)

    danke für deine Tips, aber ich kann das irgendwie n icht umsetzen, da reicht es noch nicht :)
    es wird doch machbar sein, das das nicht wackelt, sondern eine flüssige zeichnung ist :(

    Er Zeichnet auf jeden fall schonmal was..

    VB.NET-Quellcode

    1. Dim reg = New Region(New Rectangle(x1, y2, x2 - x1, Me.Height - y2))
    2. reg.Exclude(rcSelect)
    3. e.Graphics.FillRegion(br, reg)

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