C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: TextBoxのWordWrapの折返しと高さの自動調整


(過去ログ 73 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■42414 / inTopicNo.1)  TextBoxのWordWrapの折返しと高さの自動調整
  
□投稿者/ める (20回)-(2009/10/15(Thu) 13:56:35)

分類:[C#] 

毎度お世話になっております。
TextBoxに文字が入力された時orリサイズされた時に
内容に合わせてTextBoxの高さを変更したいと思っています。
ひとまず、以下のソースでうまく動いているかのように
思えるのですが、例えば

・AAAA:000000000001 
・BBB:へのへのもへじ

と言ったデータがあった場合、

┏━━━━━━━━━━━┓
┃AAAA:000000000001┃
┃BBB:へのへのもへ  ┃
┃じ                    ┃
┗━━━━━━━━━━━┛
と、 なるような場合があると思います。
(ほぼ同じ長さなのに・・・)

半角・全角が混じった時に単語単位等で
折り返しされたりされなかったりとで、
基準が良くわからず、数値上では、一行の長さがクライアント
領域幅を超えているのに、実際表示すると
WordWrapされていない等の事象が発生してしまいます。

どのようにすれば正しく計算できてサイズを
調整出来るのか教えて頂けませんか?

------------------------------
private void ResizeTextBox(object sender, EventArgs e)
{
   Size strSize;

    int tbWidth = 0; // TextBoxのクライアント領域幅
    int lineHeight = 0; // 一行高さ

    // 引数チェック
    TextBox tb = sender as TextBox;
    if (tb == null) return;

    // テキストボックスのクライアント領域の幅を取得
    tbWidth = tb.ClientSize.Width;

    // 基本の行数を取得
    int baseLines = tb.Lines.Length;

    // 改行で分割
    string[] lines = tb.Text.Replace("\r\n", "\n").Split('\n');

    foreach (string strLine in lines)
    {
        // 一行の縦横サイズを求める
        // フォントはMSUIGothic 12pt
        strSize = TextRenderer.MeasureText(strLine, tb.Font);

        // 一行の高さを求める。(初回のみ)
        if (lineHeight == 0) lineHeight = strSize.Height + 1; // +1は行間分微調整

        // もしTextBoxのクライアント領域幅より文字列の方が長い場合は、
        // WordWrapで改行されているので、何行改行されているのか
        // 調べる。
        if (tbWidth < sf.Width)
        {
            int nLine = strSize.Width / tbWidth;    // 行数
            int nMod = strSize.Width % tbWidth;     // 余り

            baseLines += (nLine - 1); // 追加行数をセット

            // 余りがある場合は1行プラス
            if (0 < nMod) baseLines++;
        }
    }
    // テキストボックスの高さを(行数*一行高さ)
    // にセットする。
    tb.Height = baseLines * lineHeight;

    return;
}

どなたか良い手法or修正方法を教えて頂けると
幸いです。昨日に引き続き質問続きですが、
宜しくお願い致します。

環境はVS2005/C#/.net2.0です。

引用返信 編集キー/
■42457 / inTopicNo.2)  Re[1]: TextBoxのWordWrapの折返しと高さの自動調整
□投稿者/ ?? (11回)-(2009/10/15(Thu) 23:40:27)
No42414 (める さん) に返信
> ・AAAA:000000000001
> ・BBB:へのへのもへじ

見たとおりですが、幅が1:2になるようなフォントサイズ・フォント種類
を設定したら良いと思いますよ。

<style>
#PT { font-family:"MS UI Gothic";font-size:12pt; }
#PX { font-family:"MS UI Gothic";font-size:12px; }
#PTG { font-family:"MS ゴシック";font-size:12pt; }
#PXG { font-family:"MS ゴシック";font-size:12px; }
#PTPG { font-family:"MSP ゴシック";font-size:12pt; }
#PXPG { font-family:"MSP ゴシック";font-size:12px; }


</style>

<fieldset><legend>MS UI Gothic 12 POINT</legend>
<div id="PT">・AAA:00000001</div>
<div id="PT">・BB:あいうえお</div>
</fieldset>
<fieldset><legend>MS UI Gothic 12 PIXEL</legend>
<div id="PX">・AAA:00000001</div>
<div id="PX">・BB:あいうえお</div>
</fieldset>
<fieldset><legend>MS ゴシック 12 POINT</legend>
<div id="PTG">・AAA:00000001</div>
<div id="PTG">・BB:あいうえお</div>
</fieldset>
<fieldset><legend>MS ゴシック 12 PIXEL</legend>
<div id="PXG">・AAA:00000001</div>
<div id="PXG">・BB:あいうえお</div>
</fieldset>
<fieldset><legend>MSP ゴシック 12 POINT</legend>
<div id="PTPG">・AAA:00000001</div>
<div id="PTPG">・BB:あいうえお</div>
</fieldset>
<fieldset><legend>MSP ゴシック 12 PIXEL</legend>
<div id="PXPG">・AAA:00000001</div>
<div id="PXPG">・BB:あいうえお</div>
</fieldset>

MS UI Gothic はプロポーショナルフォントのように見えますね・・・

引用返信 編集キー/
■42478 / inTopicNo.3)  Re[2]: TextBoxのWordWrapの折返しと高さの自動調整
□投稿者/ める (21回)-(2009/10/16(Fri) 09:52:49)
No42457 (?? さん) に返信
> ■No42414 (める さん) に返信
>>・AAAA:000000000001
>>・BBB:へのへのもへじ
>
> 見たとおりですが、幅が1:2になるようなフォントサイズ・フォント種類
> を設定したら良いと思いますよ。
>
レスありがとうございます。
恥ずかしながら初めて知ったのですが・・・
12POINTと12PIXELって違うんですね。

通常プロパティウィンドウのFontプロパティは
xxptとなっているので、ポイントだとは思うのですが、
pixelの指定って出来るのでしょうか?

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -