スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C#]テキストボックスの高さ自動調整

メモがてらにC#のテクニックをメモっていくテスト。

最近はもっぱらC#でWindows用のアプリを作っていまして、現在はランチャーアプリを作っています。
そこで標準のTextBoxの高さを内容に応じて自動決定する仕組みっていうのを盛り込んだので、今回はその方法について書いておきます。
長い名前テスト0.テーマ
左の画像みたいに、通常は表示しきれないので省略表示されるものでも、編集時は全文字表示したいときがあります。そこで、デスクトップのアプリケーション名変更のように、編集用TextBoxの幅は固定のまま、入力内容に応じてTextBoxの高さを変更する必要がでてきますよね?

そういうプロパティがあればいいんですが、プロパティには「折り返し表示」と「複数行表示の許可」程度しかなく、全文字表示のプロパティはありません。これを解決する手順として今回は以下の方法をとってみました。

1.「折り返し表示」と「複数行表示の許可」
TextBoxの幅がひたすら長くなってると見づらいですし、幅を固定しても横にスクロールさせながら編集するのは使いにくいので、以下のプロパティを有効にします。

折り返し表示:
 ・textBox.WordWrap = true
   →TextBoxの幅に応じて自動改行されて表示されます。
 ・textBox.Multiline = true
   →複数行の入力・表示ができるようになります。

改行なしの長い名前でも、折り返して表示されるようになります。ただし、これだけでは表示行数が増えたり減ったりしてもTextBoxの高さは変化せず、縦にスクロールして編集することになってしまいます。


2.表示行数の取得
TextBoxBase.Linesプロパティで行数を取得できそうなものですが、この行数というものに自動改行分は含まれていません。別途計算により取得します。

TextBoxBase.GetFirstCharIndexFromLineメソッドで、各行の先頭文字が、何文字目の文字なのかを取得することができ、これは自動改行が反映されたものになっています。
このメソッドの引数に行数を渡すと、引数に何文字目なのか返りますが、表示行を超える値を渡すと、それに相当する文字番号は存在しないため、-1が返ります。

つまりは、引数を-1が返ってくるまで1ずつ増やすことで、行数を求めることができるんですね。
(すべてのプロパティを確認したわけではないのでもっと良い方法がありそう。。。)


3.必要な高さの取得
行数が求まったら次は高さです。fontのHeightプロパティに行数をかければ大体大丈夫かと思いきや、そんなことはありません。ちゃんと計ります。TextRenderer.MeasureTextメソッドを使うと、指定のフォントを使って指定の文字を表示しようとしたときの、必要な高さと幅を返してくれます。先ほどのGetFirstCharIndexFromLineから取得できる各行先頭の文字番号を使い、各行の文字表示に必要な高さを求めます。それらの総和が編集用TextBoxに必要な最低低減の高さとなります。

しかし、ここで求めた高さに指定すると、たぶん1行表示されません。TextBoxにMargin(上下左右の余白)が指定されています。なので、求められた高さに、textBox.Margin.Verticalを加算します。これで、必要な高さぴったりの値を求めることができます。


4.自動高さ調整
あとは文字の入力のたびに内容を確認して、高さを変更するのみです。高さ変更のタイミングとしてはTextBox.TextChangedイベントが最適です。このイベントのたびに高さを再計算し、反映すればOK。


高さ自動調整機能をつけたTextBox継承クラスを作ると以後の利用が楽になるかもしれませんね。
以上が、デスクトップの名前変更時にでるTextBoxと同じような動きをするTextBoxの作り方でした。

ちゃんちゃん
Go To 物置。
プロフィール

書いてる人:つん

まったりのんびり。書いてる人の息抜きブログです。

多分連絡先↓
metal_tsun@yahoo.co.jp

カテゴリー
リンク
月別アーカイブ
バロメーター
Java歴:2005年2月から今まで。
3DCG歴:2005年8月から数年。
C歴:2006年4月から今まで。
VB歴:2007年3月からちょっと。
Delphi歴:2007年3月からちょっと。
PIC歴:2007年5月から数年。
イラスト歴:2007年12月から今まで。
DTM歴2008年2月からちょっと。
PHP歴2008年4月からちょっと。
C++歴2008年4月から今まで。
C#歴2009年1月から今まで。
Objective-C歴2009年4月から今まで。
CSS歴2012年5月から今まで。

ブログ開始日2005/10/11


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。