1

次のコード (VB.net) を使用して、パネル コントロールをビットマップとして保存しようとしています。

Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
     filename = SaveFileDialog1.FileName
     Dim CardImg As New Bitmap(Panel1.Width, Panel1.Height)
     Panel1.DrawToBitmap(CardImg, Panel1.ClientRectangle)
     CardImg.Save(filename, System.Drawing.Imaging.ImageFormat.Bmp)
 End Sub

パネルにドッキングされている Web ブラウザー コントロールを除いて、すべてが機能します。保存されたビットマップでは、このコントロールは空白のみとして表示されますが、パネル内の他のすべては正常にレンダリングされます。何か案は?

4

2 に答える 2

0

からスナップショットを保存したとき、ナビゲート後にそれWebBrowserを呼び出し.Focus()ましたが、どういうわけか白い画像が魔法のように消えてしまいました。理由はわかりませんが、私にとってはうまくいきました。

于 2013-07-23T09:56:52.603 に答える
-1

http://www.vbforums.com/showthread.php?t=385497から「ScreenCapture.vb」をダウンロードします。使用しますが、正しい長方形を識別するためにCaptureDeskTopRectangle使用する必要があるパネルの親を参照しているため、パネルの場所を使用しないでくださいyourpanel.PointToScreen(). よろしく..

アップデート:

これをチェックしてください、あなたはそれが好きです、私はあなたのケースをシミュレートし、それは機能しています:

Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Try
            Using fl As New SaveFileDialog
                fl.Filter = "PNG images|*.png"
                If fl.ShowDialog = Windows.Forms.DialogResult.OK Then
                    Dim sc As New screencapture
                    Dim pt = WebBrowser1.Parent.PointToScreen(WebBrowser1.Location)
                    Dim rec As New Rectangle(pt.X, pt.Y, WebBrowser1.Width, WebBrowser1.Height)
                    Application.DoEvents()
                    Threading.Thread.Sleep(500)
                    Using bmp As Bitmap = sc.CaptureDeskTopRectangle(rec, WebBrowser1.Width, WebBrowser1.Height)
                        bmp.Save(fl.FileName, System.Drawing.Imaging.ImageFormat.Png)
                    End Using
                End If
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

更新 2:

知らせる:

Private Sub btnBrowse_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Try
            Using fl As New SaveFileDialog
                fl.Filter = "PNG images|*.png"
                If fl.ShowDialog = Windows.Forms.DialogResult.OK Then
                    JSsetTimeout.SetTimeout(Me, "TakeShot", 1500, fl.FileName)
                End If
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub

Sub TakeShot(ByVal FilePath As String)
        Try
            Application.DoEvents()
            Dim sc As New screencapture
            Dim pt = WebBrowser1.Parent.PointToScreen(WebBrowser1.Location)
            Dim rec As New Rectangle(pt.X, pt.Y, WebBrowser1.Width, WebBrowser1.Height)
            Using bmp As Bitmap = sc.CaptureDeskTopRectangle(rec, WebBrowser1.Width, WebBrowser1.Height)
                bmp.Save(FilePath, System.Drawing.Imaging.ImageFormat.Png)
            End Using
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
End Sub

時間遅延を作成するには、以下のクラスを追加します。

Public Class JSsetTimeout

    Public res As Object = Nothing
    Dim WithEvents tm As Timer = Nothing
    Dim _MethodName As String
    Dim _args() As Object
    Dim _ClassInstacne As Object = Nothing

    Public Shared Sub SetTimeout(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        Dim jssto As New JSsetTimeout(ClassInstacne, obj, TimeSpan, args)
    End Sub

    Public Sub New(ByVal ClassInstacne As Object, ByVal obj As String, ByVal TimeSpan As Integer, ByVal ParamArray args() As Object)
        If obj IsNot Nothing Then
            _MethodName = obj
            _args = args
            _ClassInstacne = ClassInstacne
            tm = New Timer With {.Interval = TimeSpan, .Enabled = False}
            AddHandler tm.Tick, AddressOf tm_Tick
            tm.Start()
        End If
    End Sub

    Private Sub tm_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tm.Tick
        tm.Stop()
        RemoveHandler tm.Tick, AddressOf tm_Tick
        If Not String.IsNullOrEmpty(_MethodName) AndAlso _ClassInstacne IsNot Nothing Then
            res = CallByName(_ClassInstacne, _MethodName, CallType.Method, _args)
        Else
            res = Nothing
        End If
    End Sub
End Class
于 2012-02-16T11:37:45.860 に答える