tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルフレームありのWebページの全体の大きさの取得
記事No2648
投稿日: 2005/11/26(Sat) 11:38
投稿者YAS
[OSのVer]:Windows    [VBのVer]:VB.NET2005β2
いつも大変お世話になります。
Webページを見たままに印刷,また,Webページのサムネイル化を
目的にWebページをビットマップで保存したいと考えています。
いくつかのフリーソフトがあることは存じておりますが,事情が
あり自作したいのです。
以下のコードでフレームなしのWebページではページ全体の画像化
ができました。しかしフレームありの場合には
 ページの右端・下端までの長さがわからない
という問題があり,ページ全体を取得することができません。

ページ全体の長さを求めるために,具体的には
Me.WebBrowser1.Document.Window.Frames(i).Document.Body.ScrollRectangle.Height
で各フレームの高さを求めその上下左右の関係から長さを足して
全体の長さを求めようと考えました。
しかし,ScrollRectangeleはページによっては変な値を返すことがあり,また,
Me.WebBrowser1.Document.GetElementsByTagName("frame")(i).ClientRectangle.Top
または
Me.WebBrowser1.Document.Window.Frames(i).Document.Body.ClientRectangle.Top
の値がどのフレームでも0なので各フレームの上下左右関係がわかりません。
MshtmlのDomから相当するメソッドを実行しても同じでした。

まとめますと,
「フレームありのWebページでページ全体をスクロールしなくても見る
ことができるウィンドウの大きさ」を求めるために,
「各フレームのウェブブラウザ内の左上の座標と,各フレームのスク
ロールしなくても見ることができる大きさ」を求める方法が知りたいです。

よろしくご教授をお願いいたします。

Imports System.Runtime.InteropServices

Public Class form1

    Const DVASPECT_CONTENT As Integer = 1

    <DllImport("ole32.dll")> _
    Public Shared Function OleDraw( _
        ByVal pUnk As IntPtr, _
        ByVal dwAspect As Integer, _
        ByVal hdcDraw As IntPtr, _
        ByRef lprcBounds As Rectangle) _
        As Integer
    End Function

    Dim WithEvents WebBrowser1 As WebBrowser
    Dim PictureBox1 As PictureBox

    Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.WebBrowser1 = New WebBrowser
        Me.Controls.Add(WebBrowser1) 'フォームに追加しないと保護エラーになる
        Me.WebBrowser1.Visible = False
        Me.PictureBox1 = New PictureBox
        Me.Controls.Add(Me.PictureBox1)
        Me.PictureBox1.Dock = DockStyle.Fill
        Me.WebBrowser1.Navigate("hhttp://www.yahoo.co.jp")
    End Sub

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        If Me.WebBrowser1.Url.ToString = e.Url.ToString Then
            Me.WebBrowser1.Document.Body.Style = "overflow-x:hidden;overflow-y:hidden" 'スクロールバーを消す(ScrollBarsEnabled=Falseでは消えない)
            Dim Rect As Rectangle = Me.WebBrowser1.Document.Body.ScrollRectangle
            Dim BodySize As New Size(Rect.Width, Rect.Height)
            Me.Size = BodySize
            Me.WebBrowser1.Size = BodySize
            Me.PictureBox1.Size = BodySize
            Me.PictureBox1.Image = New Bitmap(BodySize.Width, BodySize.Height)
            Dim Graph As Graphics = Graphics.FromImage(Me.PictureBox1.Image) 'こうしないと後で画像が消える
            Dim Browser As Object = Me.WebBrowser1.ActiveXInstance
            Dim pUnk As IntPtr = Marshal.GetIUnknownForObject(Browser)
            Dim hDc As IntPtr = Graph.GetHdc
            OleDraw(pUnk, DVASPECT_CONTENT, hDc, Me.PictureBox1.ClientRectangle)
            Marshal.Release(pUnk)
            Graph.ReleaseHdc(hDc)
            Me.Refresh()
        End If
    End Sub
End Class
  

[ツリー表示へ]
タイトルRe: フレームありのWebページの全体の大きさの取得
記事No2649
投稿日: 2005/11/26(Sat) 12:32
投稿者YAS
先ほどのリスト,COMオブジェクトの解放が抜けておりました。
  Marshal.ReleaseComObject(Browser)
を挿入してください。

[ツリー表示へ]