11

コンテンツに応じてリッチテキストボックスコントロールのサイズを自動的に変更できるように、リッチテキストボックスコントロール内の文字列を測定する方法を誰かが説明してもらえますか?

ありがとうございました

編集:

私はそれについて考えました.RichTextBoxコントロールに異なるフォントがある場合、以下の答えはうまくいかないので、リッチテキストボックスコントロールの左上の座標を取得してから、 rtb 内のテキストの最後の行。それは基本的に、RichTextBox コントロール内の文字列の幅と高さを教えてくれます。これは可能ですか?それとも、このようにするのは悪い考えですか?

4

6 に答える 6

7

ContentsResizedイベントに次のコードを入れます。

Private Sub rtb_ContentsResized(ByVal sender As Object, ByVal e As System.Windows.Forms.ContentsResizedEventArgs) Handles txtQuestion.ContentsResized
        Dim h = e.NewRectangle.Height, w = e.NewRectangle.Width
        h = Math.Max(h, sender.Font.Height)
        h = Math.Min(h, Me.ClientSize.Height - 10 - sender.Top)
        h += sender.Height - sender.ClientSize.Height + 1
        sender.Height = h
End Sub
于 2011-04-29T05:49:45.203 に答える
3

GetPreferredSize(Size.Empty)を呼び出してみてください。これは Control クラスで定義されており、RichTextBoxControl によってオーバーライドされたプロパティであれば、探しているものを提供するはずです。

Size.Empty 以外のものをメソッドに渡すと、その値が最大制約として使用されます。Size.Empty を使用することは、潜在的なサイズが無制限であることを意味します。

于 2010-03-02T18:35:47.460 に答える
3

誰かがコントロールに入力していると仮定すると、文字が入力されるたびにイベントを発生させ (インクリメント カウンター)、文字が削除されるとデクリメントすることができます。これにより、真のカウントが得られます。

編集:

高さを調整するためにこれを試しましたか?

richTextBox1.Height = (int)(1.5 * richTextBox1.Font.Height) + richTextBox1.GetLineFromCharIndex(richTextBox1.Text.Length + 1) * richTextBox1.Font.Height + 1 + richTextBox1.Margin.Vertical;

richTextBox1.SelectionStart = 0;

richTextBox1.SelectionStart = richTextBox1.Text.Length;

または、Width を使用してこれを行うことができます。

Graphics g = Graphics.FromHwnd(richTextBox1.Handle);

SizeF f = g.MeasureString(richTextBox1.Text, richTextBox1.Font);
richTextBox1.Width = (int)(f.Width)+5;
于 2010-03-02T17:19:28.613 に答える
0

リッチ テキスト ボックスの高さの問題の解決策を見つけました..一般的な使用のために修正しました..

アプリケーションで次の構造体を作成します....

[StructLayout(LayoutKind.Sequential)]
    public struct RECT {
        public Int32 left;
        public Int32 top;
        public Int32 right;
        public Int32 bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SCROLLBARINFO {
        public Int32 cbSize;
        public RECT rcScrollBar;
        public Int32 dxyLineButton;
        public Int32 xyThumbTop;
        public Int32 xyThumbBottom;
        public Int32 reserved;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public Int32[] rgstate;
    }

フォームのクラスに次のプライベート変数を作成します (リッチ テキストの高さを計算する必要がある場合)。

private UInt32 SB_VERT = 1;
        private UInt32 OBJID_VSCROLL = 0xFFFFFFFB;

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollRange(IntPtr hWnd, UInt32 nBar, out Int32 lpMinPos, out Int32 lpMaxPos);

        [DllImport("user32.dll")]
        private static extern
            Int32 GetScrollBarInfo(IntPtr hWnd, UInt32 idObject, ref SCROLLBARINFO psbi);

フォームのクラスに次のメソッドを追加します

private int CalculateRichTextHeight(string richText) {
            int height = 0;
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.Rtf = richText;
            richTextBox.Height = this.Bounds.Height;
            richTextBox.Width = this.Bounds.Width;
            richTextBox.WordWrap = false;
            int nHeight = 0;
            int nMin = 0, nMax = 0;

            SCROLLBARINFO psbi = new SCROLLBARINFO();
            psbi.cbSize = Marshal.SizeOf(psbi);

            richTextBox.Height = 10;
            richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical;

            int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi);
            if (psbi.rgstate[0] == 0) {
                GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax);
                height = (nMax - nMin);
            }

            return height;
        }

上記のメソッドを変更して、要件に従って機能させる必要がある場合があります...通常のテキストではなく、Rtf文字列をパラメーターとしてメソッドに送信し、メソッドのRichtextbox変数に使用可能な幅と高さを割り当てるようにしてください.. .

要件に応じて WordWrap で遊ぶことができます...

于 2012-02-23T14:38:47.077 に答える
0

bathineniの素晴らしい答えに追加してください:

背景: 紙にレンダリングするために RTF 出力の高さを測定する必要がありました。ページングを制御するために必要なカスタム動的ページ ヘッダー/フッターがあるため)。

(RichTextBox.GetLineFromCharIndex は複雑な RTF のために私をがっかりさせました。ワードラップを使用した行と複数列のテーブルを含みます)。

とにかく、他の誰かが恐ろしいウィンドウで私のアプリを使用するまで、すべて正常に機能していました。「テキストやその他の項目を大きくまたは小さくする」(DPI 設定)。(プリンターはテキストと列を正しくレンダリングしましたが、ページの長さだけがすべて間違っていました。)

要するに、より大きなテキストがソース RTF tx および cellx 値に適切に収まらなかったため、DPI の違いのみを因数分解できませんでした。

とにかく、他の人が同様のクレイジーなことをしている場合に備えて、ちょっとした試行錯誤の末、bathineni CalculateRichTextHeight メソッドに次の (最終的にはごく少数の) 変更を加えました。

RichTextBox richTextBox = new RichTextBox();     // same as original
int dpix = richTextBox.CreateGraphics().DpiX;    // get dpi
richTextBox.WordWrap = true;                     // I needed this, you many not
  // ... set size etc - same as original answer
richTextBox.Scale(new System.Drawing.SizeF(dpix / 96, dpix / 96));  // scale RTB
  // ...
  // 96? my original calculations based on windows default 96dpi settings.

そうでなければあいまいな Control.Scale(sizef) は、実際には何かに役立つようです。

注: 結果を実際の出力行に変換する場合 (私の場合、すべての \pard は "\sl-240\slmult0" で、1 行あたり 16 (pix?) になります)、除数をリファクタリングすることも忘れないでください。つまり、私の場合:

lines = height / (int)(16 * (dpix / 96))
于 2014-10-17T07:00:11.437 に答える
0

を呼び出して文字列を測定できますTextRenderer.MeasureText

ただし、テキストに複数のフォントが含まれている場合、これは機能しません。

編集GetPositionFromCharIndex:メソッドを探しています。
複数の行がある場合は、各行の最後の文字の X 座標の最大値を取得する必要があることに注意してください。

于 2010-03-02T16:57:02.180 に答える