あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

CompactFrameworkで、ラベルの文字列長さを調べる方法

 タグを一度整理しないといかんな、と思いつつ。とりあえずソフトウェア開発タグであげてみる。
 Labelの折り返しが行われているのを、どのように判定するか?ということ。
 CompactFrameworkの場合、Autosizeとか便利なプロパティが無いので、自分で文字列が折り返されているかどうかを判断する必要がある。
 例によってAPIを呼び出す必要があるのかと思いつつ検索したけど見つからないので、MSDNフォーラムに質問投げてみたところ回答をいただいた。
 vb.netでのコードは以下の通り。

        Dim g As Graphics = CreateGraphics()
        Dim txtWidth As Integer = g.MeasureString(Label1.Text, Label1.Font).Width
        If Label1.Width - 2 > txtWidth Then
            Debug.WriteLine(Label4.Width & " > " & txtWidth)
        Else
            Debug.WriteLine(Label4.Width & " <= " & txtWidth)
        End If

 GrapicsオブジェクトのMeasureStringメソッドでサイズを取得できるので、それをラベルの幅と比較すると、ラベルの範囲に入りきるかどうかが分かるとのこと。
 が、同時に

英語の場合は 禁則処理が働くため、単語単位で改行判定が行われます。
そのため単純に文字幅だけで判定できません。

 という指摘も。
 今回やりたいことは、Labelにフルパスを記載することなので、英語であり、半角スペースがあるので禁則処理がある、というケース。なので、どうも単純には行きそうにない。
 もっとも、2行で収まる範囲であれば禁則が発生しようとどうだろうと関係ないのだけれども(そもそも折り返しが不要なら禁則とか関係ない)、3行になろうかというような時はちと困る。
 コメント欄でアイディアいただいたように、プログラム側でなくユーザ側で対処するという方法もあるにはあるのだけれども。これも、全部で何行まで対応すれば良いのか、という問題が残る。3行に達する可能性がある、と言うことは同時に4行目もありうると言うことだし。2行のみ対応なら、考えなくても良いのだけれども。
 禁則の発生しそうな文字を別の文字で置換する、という方法とかも考えられるかも。