none
Bildschirminhalt speichern funktioniert nur einmal RRS feed

  • Frage

  • Hallo Forum, 

    in einer Anwendung habe ich einen Bildschirminhalt, der breiter ist als die tatsächliche Ansicht. 

    Um diese Ansicht zu speichern, nutze ich folgenden Menü-Code:

      Private Sub DruckenToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles DruckenToolStripMenuItem.Click
            Dim mp = Me.MainPanel
            Dim clientSize As Size = Me.ClientSize
            Dim bounds = Me.Bounds
            Dim mpPosition = mp.AutoScrollPosition
            Try
                Dim panelLeft As Integer = mp.Controls.Cast(Of Control)().Min(Function(c) c.Left - mp.AutoScrollPosition.X)
                Dim panelTop As Integer = mp.Controls.Cast(Of Control)().Min(Function(c) c.Top - mp.AutoScrollPosition.Y)
                Dim panelWidth As Integer = mp.Controls.Cast(Of Control)().Max(Function(c) c.Right - mp.AutoScrollPosition.X)
                Dim panelHeight As Integer = mp.Controls.Cast(Of Control)().Max(Function(c) c.Bottom - mp.AutoScrollPosition.Y)
    
                panelWidth += mp.Left + panelLeft
                panelHeight += mp.Top + panelTop
    
                'Me.ClientSize = New Size(panelWidth, panelHeight)
                Me.Bounds = New Rectangle(bounds.Left, bounds.Top, bounds.Width - clientSize.Width + panelWidth, bounds.Height - clientSize.Height + panelHeight)
                mp.AutoScrollPosition = Point.Empty
                SaveName = SaveName & vTurnierName & "\Spielplan.jpg"
      
                Call SavePanelToBitmapAndClipBoard2(mp, SaveName)
            Finally
                Me.ClientSize = clientSize
                mp.AutoScrollPosition = mpPosition
            End Try
        End Sub


    und...

        Public Shared Sub SavePanelToBitmapAndClipBoard2(panel As ScrollableControl, fileName As String)
            Dim panelLeft As Integer = panel.Controls.Cast(Of Control)().Min(Function(c) c.Left - panel.AutoScrollPosition.X)
            Dim panelTop As Integer = panel.Controls.Cast(Of Control)().Min(Function(c) c.Top - panel.AutoScrollPosition.Y)
            Dim panelWidth As Integer = panel.Controls.Cast(Of Control)().Max(Function(c) c.Right - panel.AutoScrollPosition.X)
            Dim panelHeight As Integer = panel.Controls.Cast(Of Control)().Max(Function(c) c.Bottom - panel.AutoScrollPosition.Y)
    
            ' Als rechter/unterer Rand
            panelWidth += panelLeft
            panelHeight += panelTop
    
            Dim bitmapSize = New Size(panelWidth, panelHeight)
            Using panelBitmap = New Bitmap(bitmapSize.Width, bitmapSize.Height)
                ' Hintergrund wie Panel BackColor
                Using g = Graphics.FromImage(panelBitmap)
                    Using backPen = New SolidBrush(panel.BackColor)
                        g.FillRectangle(backPen, New Rectangle(Point.Empty, bitmapSize))
                    End Using
                End Using
                ' Steuerelemente auf die Bitmap zeichnen
                For Each c As Control In panel.Controls
                    Dim controlBounds = New Rectangle(
                        c.Left - panel.AutoScrollPosition.X, c.Top - panel.AutoScrollPosition.Y,
                        c.Width, c.Height)
                    c.DrawToBitmap(panelBitmap, controlBounds)
                Next
                ' Als JPG Speichern
                panelBitmap.Save(fileName, Imaging.ImageFormat.Jpeg)
                ' und ins Clipboard
                Clipboard.SetImage(panelBitmap)
            End Using
            MsgBox("Spielplan erfolgreich gespeichert!", vbOKOnly + vbInformation, "Speichern erfolgreich...")
    
        End Sub

    Das speichern funktioniert leider nur beim ersten Mal, jedes weitere Mal bekomme ich einen allgemeinen Fehler in GDI+

    mit diesen Informationen:

    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
    
    ************** Ausnahmetext **************
    System.Runtime.InteropServices.ExternalException (0x80004005): Allgemeiner Fehler in GDI+.
       bei System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
       bei DGWPlaner.frm16KO.SavePanelToBitmapAndClipBoard2(ScrollableControl panel, String fileName) in E:\Entwicklung\VB.Net\DGWPlaner\16KO.vb:Zeile 408.
       bei DGWPlaner.frm16KO.DruckenToolStripMenuItem_Click(Object sender, EventArgs e) in E:\Entwicklung\VB.Net\DGWPlaner\16KO.vb:Zeile 375.
       bei System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
       bei System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
       bei System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
       bei System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
       bei System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
       bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ToolStrip.WndProc(Message& m)
       bei System.Windows.Forms.MenuStrip.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    
    
    ************** Geladene Assemblys **************
    mscorlib
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll.
    ----------------------------------------
    DGWPlaner
        Assembly-Version: 5.0.0.0.
        Win32-Version: 5.0.0.0.
        CodeBase: file:///E:/Entwicklung/VB.Net/DGWPlaner/bin/Debug/DGWPlaner.EXE.
    ----------------------------------------
    Microsoft.VisualBasic
        Assembly-Version: 10.0.0.0.
        Win32-Version: 14.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
    ----------------------------------------
    System
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Core
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
    ----------------------------------------
    System.Windows.Forms
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System.Drawing
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System.Runtime.Remoting
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
    ----------------------------------------
    System.Configuration
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
    ----------------------------------------
    System.Xml
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
    ----------------------------------------
    mscorlib.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    ----------------------------------------
    System.Windows.Forms.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------
    Accessibility
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll.
    ----------------------------------------
    System.Drawing.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.1586.0 built by: NETFXREL2.
        CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing.resources/v4.0_4.0.0.0_de_b03f5f7f11d50a3a/System.Drawing.resources.dll.
    ----------------------------------------
    
    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.
    
    Zum Beispiel:
    
    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.
    
    
    

    Ich bin leider nicht so firm im Debuggen, vielleicht hat ja jemand eine Idee, wo ich diesen Fehler suchen muss..

    Ein Umbenennen der vorhandenen Datei führt zu keinem Erfolg.

    LG Micha

    Dienstag, 24. Januar 2017 14:40

Antworten

  • Hi,

    ich tippe mal auf:

        SaveName = SaveName & vTurnierName & "\Spielplan.jpg"

    Wenn Du savename global hälst, dann wird beim 2. und späteren speichern der name erstmal dupliziert und dann noch der TurnierName und "\spielplan.jpg" angehängt, was dann in

    vTurnierName\Spielplan.jpgvTurnierName\Spielplan.jpg etc endet.

    Viele Grüße,

      Thorsten

    • Bearbeitet Thorsten Gudera Dienstag, 24. Januar 2017 15:38
    • Als Antwort markiert MKnost Dienstag, 24. Januar 2017 15:46
    Dienstag, 24. Januar 2017 15:36

Alle Antworten

  • Hi,

    ich tippe mal auf:

        SaveName = SaveName & vTurnierName & "\Spielplan.jpg"

    Wenn Du savename global hälst, dann wird beim 2. und späteren speichern der name erstmal dupliziert und dann noch der TurnierName und "\spielplan.jpg" angehängt, was dann in

    vTurnierName\Spielplan.jpgvTurnierName\Spielplan.jpg etc endet.

    Viele Grüße,

      Thorsten

    • Bearbeitet Thorsten Gudera Dienstag, 24. Januar 2017 15:38
    • Als Antwort markiert MKnost Dienstag, 24. Januar 2017 15:46
    Dienstag, 24. Januar 2017 15:36
  • Ha, perfekt!!! Das wars... danke, das gabs auch noch an anderen Stellen.... Manchmal sieht man den Wald vor lauter Bäumen nicht! 

    LG Micha

    Dienstag, 24. Januar 2017 15:46