8

このコードは、コンテンツに応じて RichTextBox のサイズを自動的に変更します。特にテーブルに問題があります。 \t無視することができます。マネージド ソリューションを試しましたが、現在はプラットフォームの呼び出しを試みています。現在の出力:

ここに画像の説明を入力

    [DllImport("gdi32.dll")]
    static extern bool GetTextExtentPoint32(IntPtr hdc, string lpString, int cbString, out SIZE lpSize);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr GetDC(IntPtr hWnd);

    [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct SIZE
    {
        public int cx;
        public int cy;

        public SIZE(int cx, int cy)
        {
            this.cx = cx;
            this.cy = cy;
        }
    }

    public static void Main()
    {
        Form form = new Form();
        RichTextBox rtfBox = new RichTextBox();

        rtfBox.Rtf = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil Arial;}}\viewkind4\uc1\trowd\trgaph100\cellx1000\cellx2000\pard\intbl\lang1033\f0\fs20  hi\cell  bye\cell\row\intbl  one\cell  two\cell\row\pard\par}";
        rtfBox.ScrollBars = RichTextBoxScrollBars.None;

        string sInput = "hi\t bye\t\n";// one\t two\t\n";
        SIZE CharSize;

        form.Controls.Add(rtfBox);

        IntPtr hdc = GetDC(IntPtr.Zero);//Context for entire screen
        GetTextExtentPoint32(hdc, sInput, sInput.Length, out CharSize);

        rtfBox.Width = CharSize.cx;
        rtfBox.Height = CharSize.cy;

        form.Visible = false;

        form.ShowDialog();
    }

(簡単にするために、これは System.Windows.Forms.dll を参照するコンソール アプリケーションです)。

4

3 に答える 3

14

ContentsResizedイベントはご覧になりましたか?イベントが発生したときに呼び出される次のメソッドを追加します。

private void richTextBox_ContentsResized(object sender, ContentsResizedEventArgs e)
{
    var richTextBox = (RichTextBox) sender;
    richTextBox.Width = e.NewRectangle.Width;
    richTextBox.Height = e.NewRectangle.Height;
}

RTF コンテンツが ( を使用してRtf)変更された場合、RichTextBoxそのコンテンツに合わせてサイズを変更する必要があります。WordWrapプロパティも に設定してくださいfalse


私はあなたのテーブルの例でそれを試してみましたが、うまくいくように見えます(少しオフセットがありますが、調整されたサイズに数ピクセルの幅を追加することで解決できる可能性があります-なぜそれが起こるのかわかりません):

P.Brian.Mackey 編集
この回答は私にとってはうまくいきました。明確にするために、ボーダー修正を含む最終的なコードは次のとおりです。

    public static void Main()
    {
        string sInput = "hi\t bye\t\n";// one\t two\t\n";
        SIZE CharSize;
        Form form = new Form();
        RichTextBox rtfBox = new RichTextBox();
        rtfBox.ContentsResized += (object sender, ContentsResizedEventArgs e) =>
        {
            var richTextBox = (RichTextBox)sender;
            richTextBox.Width = e.NewRectangle.Width;
            richTextBox.Height = e.NewRectangle.Height;
            rtfBox.Width += rtfBox.Margin.Horizontal + SystemInformation.HorizontalResizeBorderThickness;
        };

        rtfBox.WordWrap = false;
        rtfBox.ScrollBars = RichTextBoxScrollBars.None;

        rtfBox.Rtf = @"{\rtf1\ansi\deff0{\fonttbl{\f0\fnil Arial;}}\viewkind4\uc1\trowd\trgaph100\cellx1000\cellx2000\pard\intbl\lang1033\f0\fs20  hi\cell  bye\cell\row\intbl  one\cell  two\cell\row\pard\par}";

        form.Controls.Add(rtfBox);
        form.ShowDialog();
    }
于 2012-08-10T22:03:35.260 に答える
2

この回答で説明されているように、GetPreferredSizeを使用する方がはるかに簡単です。ContentsResized イベントを待つ必要はありません。

于 2015-04-23T21:35:17.607 に答える
0

高さはどうですか?
追加した

richTextBox.Height += richTextBox.Margin.Vertical +  
SystemInformation.VerticalResizeBorderThickness;  

最後に。

また、拡張メソッドの良い候補のようにも見えます:

static public class RichTextBoxResizer {  
    static public void ResizeToContents(this RichTextBox richTextBox, ContentsResizedEventArgs e) {  
        richTextBox.Width = e.NewRectangle.Width;  
        richTextBox.Height = e.NewRectangle.Height;  

        richTextBox.Width += richTextBox.Margin.Horizontal +  
            SystemInformation.HorizontalResizeBorderThickness +  
            SystemInformation.HorizontalScrollBarThumbWidth;  

        richTextBox.Height += richTextBox.Margin.Vertical +  
            SystemInformation.VerticalResizeBorderThickness;  
    }   

    static public void ResizeToContentsHorizontally(this RichTextBox richTextBox, ContentsResizedEventArgs e) {
        richTextBox.Width = e.NewRectangle.Width;

        richTextBox.Width += richTextBox.Margin.Horizontal +
            SystemInformation.HorizontalResizeBorderThickness +
            SystemInformation.HorizontalScrollBarThumbWidth;
    }

    static public void ResizeToContentsVertically(this RichTextBox richTextBox, ContentsResizedEventArgs e) {
        richTextBox.Height = e.NewRectangle.Height;

        richTextBox.Height += richTextBox.Margin.Vertical +
            SystemInformation.VerticalResizeBorderThickness;
    }
}

したがって、イベント シンクは次のようになります。

private void rtfBox_ContentsResized(object sender, ContentsResizedEventArgs e) {  
    RichTextBox rtb = (RichTextBox)sender;  
    rtb.ResizeToContents(e);  
}  
于 2014-12-13T18:54:32.450 に答える