RichTextBoxコントロールのサイズをその内容に動的に変更する方法を知っている人はいますか?
6 に答える
遅すぎると思いますが、これを見てください
次の 2 行のコードのみです。
private void rtb_ContentsResized(object sender, ContentsResizedEventArgs e)
{
((RichTextBox)sender).Height = e.NewRectangle.Height + 5;
}
固定フォントを想定すると、次のようなことができます。
using (Graphics g = CreateGraphics())
{
richTextBox.Height = (int)g.MeasureString(richTextBox.Text,
richTextBox.Font, richTextBox.Width).Height;
}
これはちょっと面倒です。C# の RichTextBox を使用すると、しばしばイライラします。スクロールバーなしでコンテンツを保持するのに十分な大きさのボックスのサイズを設定しようとしていますか?
RichTextBox のフォントが一定の場合、TextRenderer.MeasureText を使用して必要なサイズを簡単に測定し、ボックスの幅を制約として渡すことができます。
ContentsResized イベントは ContentsResizedEventsArgs を提供します。これにより、テキスト領域の大きさを示す NewRectangle が提供されます。ただし、テキストが変更されたときにのみ発生します。これは、既存のリッチテキストボックスを単に測定したい場合にはあまり役に立ちません (ただし、ボックスのテキストをそれ自体に設定して、このイベントをトリガーするなどのハックを行うこともできます)。
EM_GETLINECOUNT ( http://ryanfarley.com/blog/archive/2004/04/07/511.aspx ) などを使用するなど、Win32 API 呼び出しも多数あります。
非常に安価な解決策 (問題が発生する可能性があります) は、自動調整ラベルに同じフォントとサイズのテキストを同時に入力し、ラベルの幅を RTB の幅にコピーすることです。
したがって、次のようになります。
RichTextBox rtb = new RichTextBox();
rtb.Text = "this is some text";
rtb.Font = new Font("Franklin Gothic Medium Cond", 10, FontStyle.Regular);
Label fittingLabel = new Label();
fittingLabel.Text = rtb.Text;
fittingLabel.Font = rtb.Font;
fittingLabel.AutoSize = true;
//Not sure if it's necessary to add the label to the form for it to autosize...
fittingLabel.Location = new Point(-1000,-1000);
this.Controls.Add(fittingLabel);
rtb.Width = fittingLabel.Width;
this.Controls.Remove(fittingLabel);
この回答で説明されているように、GetPreferredSizeを使用する方がはるかに簡単です。その後、ContentsResized イベントを待つ必要はありません。
リッチ テキスト ボックスの高さの問題の解決策を見つけました..一般的な使用のために修正しました..
アプリケーションで次の構造体を作成します....
[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 で遊ぶことができます...