2012-02-16 63 views
1

我嘗試使用下面的代碼(VB.net)保存面板控制爲位圖:繪製WebBrowser控件位圖

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瀏覽器控件,這是停靠在面板上。在保存的位圖中,此控件僅顯示爲空白,而面板中的其他所有內容都呈現良好。有任何想法嗎?

+0

[WebBrowser.DrawtoBitmap()爲少數網站生成空白圖像的可能重複](http://stackoverflow.com/questions/5351830/webbrowser-drawtobitmap-generating-blank-images-for-few-sites-consistently ) – 2012-02-16 02:32:48

+0

問題是'WebBrowser'控件是一個ActiveX控件,它不支持'[DrawToBitmap']方法按照[文檔](http://msdn.microsoft.com/en-我們/庫/ system.windows.forms.control.drawtobitmap.aspx)。 – 2012-02-16 02:33:44

+1

使用IHTMLElementRender:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6354ec94-503b-45b6-be2f-94bbd3bc460a – 2012-02-16 04:01:55

回答

-1

http://www.vbforums.com/showthread.php?t=385497下載「ScreenCapture.vb」, 使用CaptureDeskTopRectangle,但你不應該用你的面板的位置,因爲它 參考面板家長,你應該使用yourpanel.PointToScreen()識別正確 矩形。 問候..

UPDATE:

檢查了這一點,你會去喜歡它,我similute你的情況下,它的工作:

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 
+0

我可以使用WebBrowser將webBrowser控件繪製到位圖.DrawToBitmap(CardImg,WebBrowser.ClientRectangle)。但是,這會導致瀏覽器的圖像被繪製在位圖的角落。如何設置目標圖像中的哪個位置來繪製控件? – Derek 2012-02-17 01:11:15

+0

此外,使用您使用的方法並沒有太多意義。稍微澄清一下會很棒。此外,捕獲屏幕還會捕獲仍在面板上的另存爲對話框。 – Derek 2012-02-17 01:32:48

+0

你有沒有檢查我的更新,它的工作是100%,嘗試一下。 – 2012-02-21 10:50:15

0

當我瀏覽保存後從WebBrowser我打電話就可以了.Focus()快照 - 不知何故白色畫面產生神奇disapperard。不知道爲什麼,但它對我有效。