tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルWebBrowserのスクロール制御
記事No11807
投稿日: 2017/03/21(Tue) 17:06
投稿者祖父プログラマ
Windows7 Professional SP1  .NET Framework 4.5 日本語

VB2005 WebBrowser で、スクロール位置の取得と設定を試みています。

.Document.Body.ScrollLeft と ScrollTop で制御できそうなのですが、

値を取得するとゼロゼロです。(実際にはスクロールしています。)

また、プログラムで ScrollLeft や ScrollTop を変更しても反映されません。

何故??? ご存知の方お教え下さい。

よろしくお願いします。

[ツリー表示へ]
タイトルRe: WebBrowserのスクロール制御
記事No11808
投稿日: 2017/03/21(Tue) 17:59
投稿者Hongliang
ブラウザの動作モードによって、body要素から取得/設定できる場合と、html要素から取得/設定できる場合に違いがあるようです。
参考:
hhttps://www.google.co.jp/search?q=scrolltop+doctype&lr=lang_ja

判定が面倒であれば、
・取得時は、まず.Bodyから値を取得し、0であれば.Body.Parentから値を取得してみる
・設定時は、.Bodyと.Body.Parentの両方に対して設定する
とすればいける気がします。

[ツリー表示へ]
タイトルRe^2: WebBrowserのスクロール制御
記事No11809
投稿日: 2017/03/22(Wed) 12:02
投稿者祖父プログラマ
Hongliang様
ありがとうございました。
残念ながら直ちには上手く取得できませんでした。
情報を基にもう少し調べてみます。
HPがフレームに分かれていることに原因がありそうです。

[ツリー表示へ]
タイトルRe^3: WebBrowserのスクロール制御
記事No11810
投稿日: 2017/03/23(Thu) 13:01
投稿者魔界の仮面弁士
>>> .Document.Body.ScrollLeft と ScrollTop で制御できそうなのですが、
> HPがフレームに分かれていることに原因がありそうです。

フレームページの Document ではなく、
親ページの Document を操作していませんか?


Imports System.Windows.Forms
Public Class Form1
    Private WithEvents menuFrame As HtmlWindow
    Private WithEvents topFrame As HtmlWindow

    Private Const SampleUrl As String = "http://hanatyan.sakura.ne.jp/vbhlp/index.html"

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        Me.WebBrowser1.Navigate(SampleUrl)
    End Sub
    Private cnt As Integer = 0
    Private Sub WebBrowser1_DocumentCompleted( _
            ByVal sender As Object, _
            ByVal e As WebBrowserDocumentCompletedEventArgs _
            ) Handles WebBrowser1.DocumentCompleted
        '今回の URL このイベントは、3回発生します。
        '最初の2回は、フレームから呼ばれた menu.htm と top.htm のもので、
        '最後の3回目が、親ページとなる index.html のものです。
        Debug.WriteLine(e.Url)
        cnt += 1
        If cnt = 3 Then
            Dim frames As HtmlWindowCollection = Me.WebBrowser1.Document.Window.Frames
            menuFrame = frames(0)
            topFrame = frames(1)

            Timer1.Interval = 55
            Timer2.Interval = 100
            Timer1.Start()
            Timer2.Start()
        End If
    End Sub

    Private offset1 As Integer = 4
    Private preTop1 As Integer = 0
    Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
        menuFrame.Document.Body.ScrollTop += offset1
        If menuFrame.Document.Body.ScrollTop = preTop1 Then
            offset1 *= -1
        End If
        preTop1 = menuFrame.Document.Body.ScrollTop
    End Sub

    Private offset2 As Integer = 7
    Private preTop2 As Integer = 0
    Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer2.Tick
        topFrame.Document.Body.ScrollTop += offset2
        If topFrame.Document.Body.ScrollTop = preTop2 Then
            offset2 *= -1
        End If
        preTop2 = topFrame.Document.Body.ScrollTop
    End Sub
End Class


--- 以下蛇足 ---

> Private Const SampleUrl As String = "http://hanatyan.sakura.ne.jp/vbhlp/index.html"

上記のページでは、HTML ページの冒頭に
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
が指定されていますが、システム識別子は省略するものでは無いので
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
が適切な宣言です。また、<FRAMESET> を使うのであれば、Transitional な DTD は使えないので
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
の文書型で宣言されるべきかと思います。>管理人さん

一方、<NOFRAMES> 要素については、HTML 4.01 Frameset でも
HTML 4.01 Transitional でも使えます。(使い方は異なりますが)

HTML 4.01 Transitional
 → <NOFRAMES>の直下に<BODY>を書いてはならない。<BODY>の下に<NOFRAMES>を書くことはできる。

HTML 4.01 Frameset
 → <NOFRAMES>の直下に<BODY>が必ず必要。<BODY>の子孫に<NOFRAMES>を含めてはいけない。

[ツリー表示へ]
タイトルRe^4: WebBrowserのスクロール制御
記事No11814
投稿日: 2017/03/24(Fri) 10:01
投稿者祖父プログラマ
魔界の仮面弁士さま

ありがとうございました!!!

>
> フレームページの Document ではなく、
> 親ページの Document を操作していませんか?
>

その通りだったようで、それでゼロゼロが返って来たのですね。
掲載いただいたソースにより、私の課題は解決できそうに思います。

本当にありがとうございました。

[ツリー表示へ]