簡體   English   中英

根據內容調整RichTextBox的大小

[英]Size RichTextBox according to contents

此代碼根據其內容自動調整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)

你看過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();
    }

如本答案所述,使用GetPreferredSize要容易得多。 然后你不需要等待ContentsResized事件,

高度怎么樣?
我補充道

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);  
}  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM