none
RichTextBox サイズ変更時にスクロールバーが表示されない場合がある RRS feed

  • 質問

  • いつもお世話になっております。

    表題の件について、質問をさせてください。
    RichTextBoxを画面サイズに追従してサイズ変更するようにし、
    入力されている文字は右端で折り返し、
    領域をはみ出したらスクロールバーが表示されるように設定しました。
    この時、画面の横幅を縮めてはみ出す場合にはスクロールバーが表示されるのですが、
    縦幅を縮めた際にはスクロールバーが表示されませんでした。
    (はみ出している状態が維持されるように、画面の縦幅を広げると表示されました)
    何か対処法がありますでしょうか。

    環境は、Visual Studio2015で、.NET Framework4.5を対象とした、Windowsフォームアプリケーションを作成しようとしています。
    問題の確認として、新しいWindowsフォーククラスを作成し、そこにRichTextBoxをドッキング(Fill)、
    RichTextBoxのScrollBarsプロパティにVerticalを設定して長文を打ち込んだ状態で実行し、
    表示されたウィンドウサイズを変更するだけで発生しました。

    今回やりたいこととしては、エクスプローラーの詳細ウィンドウ表示中のように、
    左側にデータ一覧、右側に選択したデータの詳細情報表示欄をもつ画面を作成しようとしています。
    基本的にはデータ名、アイコン、各種プロパティとそこまで長いデータでもないのですが、
    一つデータの詳細説明欄として、各データの作成者が自由に文章を登録できる項目が存在しています。
    それ以外のデータについてはLabelやPictureBoxを使用して、
    画面サイズをそれがはみ出さないサイズに設定しても問題にはならないのですが、
    最後の説明欄だけは必要サイズ確保してしまうと大きくなりすぎるので、
    画面サイズに合わせて拡大・縮小するようにし(DocStyle.Fillのように)、
    自動的に右で折り返してはみ出す場合にはスクロールバーを表示するようにしようとしました。
    表示しきれる場合にはスクロールバーが表示されないほうが良いので、
    TextBoxではなくRichTextBoxのScrollBarsにVerticalを設定して対応しようとしました。
    しかし、前述の問題が発生しており、どう対処したものか悩んでおります。
    (難しいようでしたら常時縦スクロールバーを表示するだけですが)
    本現象について何かご存知でしたら教えていただけますでしょうか。

    よろしくお願いします。

    2021年3月19日 1:11

回答

  • こんな?

    namespace WindowsFormsApp1
    {
        using System;
        using System.Drawing;
        using System.Text;
        using System.Windows.Forms;
    
        public partial class Form2 : Form
        {
            RichTextBox richTextBox = new RichTextBox();
            Timer timer = new Timer();
    
            public Form2()
            {
                this.ClientSize = new Size(400, 400);
    
                richTextBox.Dock = DockStyle.Fill;
                this.Controls.Add(richTextBox);
                richTextBox.SizeChanged += RichTextBox_SizeChanged;
    
                System.Text.StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 20; i++)
                {
                    sb.AppendLine("ABCDEFG");
                }
                richTextBox.Text = sb.ToString();
    
                timer.Interval = 100;
                timer.Tick += Timer_Tick;
                timer.Start();
            }
    
            private void Timer_Tick(object sender, EventArgs e)
            {
                if (this.ClientSize.Height > 100)
                {
                    this.ClientSize = new Size(this.ClientSize.Width, this.ClientSize.Height - 1);
                }
                else
                {
                    timer.Stop();
                }
            }
    
            private void RichTextBox_SizeChanged(object sender, EventArgs e)
            {
                var rtb = (RichTextBox)sender;
                rtb.Invalidate();
            }
        }
    }
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2021年3月19日 4:05
    • 回答としてマーク Toma1988 2021年3月22日 1:45
    2021年3月19日 3:59

すべての返信

  • こんな?

    namespace WindowsFormsApp1
    {
        using System;
        using System.Drawing;
        using System.Text;
        using System.Windows.Forms;
    
        public partial class Form2 : Form
        {
            RichTextBox richTextBox = new RichTextBox();
            Timer timer = new Timer();
    
            public Form2()
            {
                this.ClientSize = new Size(400, 400);
    
                richTextBox.Dock = DockStyle.Fill;
                this.Controls.Add(richTextBox);
                richTextBox.SizeChanged += RichTextBox_SizeChanged;
    
                System.Text.StringBuilder sb = new StringBuilder();
                for (int i = 0; i < 20; i++)
                {
                    sb.AppendLine("ABCDEFG");
                }
                richTextBox.Text = sb.ToString();
    
                timer.Interval = 100;
                timer.Tick += Timer_Tick;
                timer.Start();
            }
    
            private void Timer_Tick(object sender, EventArgs e)
            {
                if (this.ClientSize.Height > 100)
                {
                    this.ClientSize = new Size(this.ClientSize.Width, this.ClientSize.Height - 1);
                }
                else
                {
                    timer.Stop();
                }
            }
    
            private void RichTextBox_SizeChanged(object sender, EventArgs e)
            {
                var rtb = (RichTextBox)sender;
                rtb.Invalidate();
            }
        }
    }
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2021年3月19日 4:05
    • 回答としてマーク Toma1988 2021年3月22日 1:45
    2021年3月19日 3:59
  • gekkaさん
    回答ありがとうございます。

    なるほど、たんにサイズ変更の際に描画を更新してやればよかったんですね。
    自分の作成したかったアプリケーションでも、問題なくスクロールバーが表示されることが確認できました。

    2021年3月22日 1:51