C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: ScrollToCaret以外でのスクロール操作


(過去ログ 127 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■75511 / inTopicNo.1)  ScrollToCaret以外でのスクロール操作
  
□投稿者/ Mira (7回)-(2015/04/01(Wed) 14:00:36)

分類:[VB.NET/VB2005 以降] 

いつも参考にさせて貰っています。今回も宜しくお願いします(.NET Framework 4)

質問
ScrollToCaret以外でスクロール操作を行いたいのですが何か方法はあるでしょうか?

タイトルの件ですがRichTextBoxを非同期処理でスクロール操作しています
ScrollToCaretにて実現しているのですが問題点が二つほどあり困っております

(1)RichTextBoxが一時的にFocusを獲得しているようで他のテキストボックスにてIME変換中に誤動作が発生する
(変換中以外の文字が全選択されるような現象、一応事前にSelectionStart、SelectionLengthを保存し設定しなおすことで解決しています)
(2)RichTextBoxの高さによっては実際の最下行よりも下にスクロールする
(最後の行よりも下に約一行分のスペースが発生し、スクロールバーを手動で触るとスペースがなくなる)
引用返信 編集キー/
■75525 / inTopicNo.2)  Re[1]: ScrollToCaret以外でのスクロール操作
□投稿者/ wakuwaku (1回)-(2015/04/02(Thu) 11:28:02)
スクロールさせる目的なんですか?

コントロールはRichTextBoxでなければいけませんか?


目的が最終行を表示することで、RichTextBoxにこだわらないのであれば
TextBoxのAppendTextを使用し、最終行を表示することで解決できると思います。
引用返信 編集キー/
■75526 / inTopicNo.3)  Re[2]: ScrollToCaret以外でのスクロール操作
□投稿者/ Mira (8回)-(2015/04/02(Thu) 12:21:29)
No75525 (wakuwaku さん) に返信

wakuwaku様回答ありがとうございます
情報が少なくて申し訳ありません

> スクロールさせる目的なんですか?

文字、画像を末尾に追加後に最下行にスクロールさせるが目的です

> コントロールはRichTextBoxでなければいけませんか?

色付き文字、ハイパーリンク、画像を末尾に追加するような操作を非同期で行っています
ユーザーによる編集作業はできないようになっています(RichTextBoxはReadOnly)
ユーザーからの操作はLinkClickedイベントのみです

同等のことが行えれば他のコントロールでも構わないです

> 目的が最終行を表示することで、RichTextBoxにこだわらないのであれば
> TextBoxのAppendTextを使用し、最終行を表示することで解決できると思います。

情報ありがとうございます。これはこれで勉強になりました
TextBoxを使用する場合はAppendTextにて実装します
引用返信 編集キー/
■75527 / inTopicNo.4)  Re[3]: ScrollToCaret以外でのスクロール操作
□投稿者/ wakuwaku (2回)-(2015/04/02(Thu) 13:25:40)

> 同等のことが行えれば他のコントロールでも構わないです

・Panel等にRichTextBoxを配置し、RichTextBoxの内容によって、RichTextBoxのHeightを調節。
・スクロールはPanelに対して行う。

という感じになるでしょうか。

・RichTextのHeightの判定
・FormのSizeChangedでのRichTextBoxのWidthの調節(縦方向スクロールバーを考慮して)

などなど、めんどくさい処理が増えますね・・・。

引用返信 編集キー/
■75528 / inTopicNo.5)  Re[3]: ScrollToCaret以外でのスクロール操作
□投稿者/ PANG2 (75回)-(2015/04/02(Thu) 15:18:16)
No75526 (Mira さん) に返信
>
> 同等のことが行えれば他のコントロールでも構わないです
>

WebBrowserコントロールとか
引用返信 編集キー/
■75531 / inTopicNo.6)  Re[4]: ScrollToCaret以外でのスクロール操作
□投稿者/ Mira (9回)-(2015/04/03(Fri) 10:38:39)
wakuwaku様ご回答ありがとうございます

ご提案の件ですが親コンテナにドッキングさせたいのもありまして実現は厳しそうです

PANG2様ご回答ありがとうございます

WebBrowserまだ正しい使い方を把握してないのですが早速テストプログラムで試してみました
実運用ではTimerではなく非同期で呼び出されます

問題点
(1)スクロールがTopに戻される
(2)描画上の高さの取得方法がわからない
(3)RichTextBoxと違い上下にマージンが発生する

    Dim Count As Integer
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Count += 1
        WebBrowser1.DocumentText += "<br />" + Count.ToString
        WebBrowser1.Document.Window.ScrollTo(0, 99999)
    End Sub

RichTextBoxに出来ないことが出来そうな気がするので(ファイルの埋め込みなど)
色々試してみたいのですが問題がどんどん増えてるような気が

引用返信 編集キー/
■75532 / inTopicNo.7)  Re[5]: ScrollToCaret以外でのスクロール操作
□投稿者/ 魔界の仮面弁士 (276回)-(2015/04/03(Fri) 11:38:22)
No75531 (Mira さん) に返信
> ScrollToCaret以外でスクロール操作を行いたいのですが何か方法はあるでしょうか?
WM_VSCROLL を送ってみるとか。最終行なら SB_BOTTMOM あたりで。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=8105&KLOG=20


> 実運用ではTimerではなく非同期で呼び出されます
とはいえ、コントロールに対する操作自体は、
UI スレッド上で行われることになるはず。


> (1)スクロールがTopに戻される
DocumentText だと HTML 全体の入れ替えになってしまうので、
HTML DOM を操作したほうが良いですよ。たとえば、div タグなどを置いて
その中のテキストのみを差し替えるようにするとか。

なお、ユーザー操作等によるスクロールの通知を
受け取りたい場合は、こんな感じで。
http://dobon.net/vb/bbs/log3-52/30761.html

スクロール位置を覚えておきたいならこんな感じ。
http://recyclebin5385.blog13.fc2.com/blog-entry-31.html



> (2)描画上の高さの取得方法がわからない
clientHeight プロパティとか scrollHeight プロパティとか。
http://blog.enjoyxstudy.com/entry/20060729/p1
https://msdn.microsoft.com/en-us/library/hh781509.aspx
http://akibakokoubou.jp/blog/?p=3577


> (3)RichTextBoxと違い上下にマージンが発生する
スタイルシート(あるいは runtimeStyle プロパティ)にて、
margin 、border、padding を調整しましょう。
(ドキュメントモードの違いに注意)

http://stackoverflow.com/questions/15033023/white-space-padding-in-webbrowser-control
http://bbs.wankuma.com/index.cgi?mode=al2&namber=8311&KLOG=20
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_40412_0.html
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?no=10995&reno=10986&oya=10978&mode=msgview&page=800


C# やら VB.NET やら VB6 やら JavaScript やら、回答ソースの言語が混在していますが、
DOM を取得してからの流れは基本的に一緒なので、適宜読み替えてみてください。
引用返信 編集キー/
■75533 / inTopicNo.8)  Re[6]: ScrollToCaret以外でのスクロール操作
□投稿者/ PANG2 (76回)-(2015/04/03(Fri) 12:26:33)
divを追加する 

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        WebBrowser1.DocumentText = "<html><body></body></html>"
    End Sub

    Dim Count As Integer
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Count += 1
        Dim div As HtmlElement = WebBrowser1.Document.CreateElement("div")
        div.InnerText = Count
        WebBrowser1.Document.Body.AppendChild(div)
        WebBrowser1.Document.Window.ScrollTo(0, 99999)
    End Sub

引用返信 編集キー/
■75534 / inTopicNo.9)  Re[6]: ScrollToCaret以外でのスクロール操作
□投稿者/ Mira (10回)-(2015/04/03(Fri) 12:58:04)
魔界の仮面弁士様、PANG2様ご回答ありがとうございます

PostMessage(RichTextBox.Handle, WM_VSCROLL, SB_BOTTMOM, 0)

上記コードで問題の一つ
(2)RichTextBoxの高さによっては実際の最下行よりも下にスクロールする
が解決しました

(1)については改善しませんでした。ScrollToCaretが原因かと思っていたのですが違ったようです
しかし先にも述べた通り応急処置は行っているので解決にします


WebBrowserの件ご回答ありがとうございます
雑な試し方で申し訳ありません(^^;
こちらはこちらでおもしろいので別プログラムにて実装してみたいと考えています
また何かありましたら相談します。ありがとうございました

当初の悩みは解決したので済みにします
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -