長さが 5 文字から 1000 文字までのさまざまな文字列を返すことができるテキスト ボックスがあります。次のプロパティがあります。
- 複数行 = true
- ワードラップ = true
次のことを可能にするために、テキストボックスの他のどのプロパティを設定する必要がありますか?
- ボックスの幅は固定する必要があります
- ボックスの高さは、返されるテキストの量に応じて自動調整されます。たとえば、テキストが 3 行にまたがる場合は、高さが 3 行に調整されます。
次のコードを試してください。
public partial class Form1 : Form
{
private const int EM_GETLINECOUNT = 0xba;
[DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam);
public Form1()
{
InitializeComponent();
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
var numberOfLines = SendMessage(textBox1.Handle.ToInt32(), EM_GETLINECOUNT, 0, 0);
this.textBox1.Height = (textBox1.Font.Height + 2) * numberOfLines;
}
}
TextBox クラスに組み込まれているこれを行う機能はないようですが、Font クラスには、ベースライン間のピクセル数を返すHeightプロパティがあります。
このブログ投稿で説明されているように、TextBox 内のテキストが占める行数を調べることもできます(警告: 厳密にはエレガントではありません)。
この情報を取得したら、いくつかの簡単な計算を使用して、TextChanged ハンドラーに TextBox の高さを適切に設定させることができるはずです。
private void tb_TextChanged(object sender, EventArgs e)
{
tb.Height = (tb.Text.Split('\n').Length + 2 ) * tb.Font.Height;
}
コードからテキスト ボックスの高さを調整する必要があります。行数を数え (この記事は、まさにそれを行う方法について説明しています)、Textbox.Height
を必要な値に設定します (行数 * 8px など、内部で使用されているフォントによって異なりますTextBox
)。
リンクされた記事の解決策では、TextBox コントロール クラスをオーバーライドして、行数を取得できるようにしました。行数を取得する方法は他にもあるかもしれませんが、この記事で提案されている解決策は私には非常に洗練されているように見えます。
このようなものは、テキストボックス自体にどのように描画されるかとして、テキストの高さを与えます:
SizeF MessageSize = MyTextBoxControl.CreateGraphics()
.MeasureString(MyTextBoxControl.Text,
MyTextBoxControl.Font,
MyTextBoxControl.Width,
new StringFormat(0));
どうあるStringFormat
べきかわかりませんが、値はデフォルトの構成StringFormatFlags
には適用されないようです.TextBox
これでMessageSize.Height
、テキストボックス内のテキストの高さがわかりました。