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