tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: WebBrowserのスクロール制御
投稿日: 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>を含めてはいけない。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。