掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
テキスト(フォント)の幅を取得するには? (ID:81952)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
いろいろ試してみましたが・・・ あくまで固定幅フォントとして計算されてしまっているようで RichTextBoxのWidthギリギリでのサイズ判定・改行挿入には、 なりませんでした。 ただし、約1文字程度短い部分で改行が入りますので、バリア ブルピッチのフォントであれば、固定幅フォントの同じ文字列 長を超えることは、無いはずですので、はみ出しはしないと、 思います。 尚・・・(MSDNのヘルプ抜粋) デバイスの中には、通常のセル配列に文字を配置しないデバイス (すなわちカーニングを実行するデバイス)もあるため、文字列 内の個々の文字のサイズの総計と文字列全体のサイズとが一致し ないことがあります。 とあります。 上記の固定幅よりは短い部分での改行となるはずですので、安全 ではありますが、見栄え上、不細工な場合はあるかもしれません。 プログラムは、このようにしてみました。 szFont = RichTextBox1.Font.Name + Chr$(0) lnghFont1 = CreateFont(0, 0, 0, 0, 0, False, False, False, SHIFTJIS_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, VARIABLE_PITCH Or FF_DONTCARE, szFont) hdc = GetDC(RichTextBox1.hwnd) lnghFont2 = SelectObject(hdc, lnghFont1) p = 0 For i = 1 To Len(RichTextBox1.Text) lRet = GetTextExtentPoint32(hdc, RichTextBox1.Text, i, udtSize) If lRet > 0 Then If udtSize.cx * 15 >= RichTextBox1.Width Then p = i Debug.Print CStr(p) Exit For End If End If Next i lRet = SelectObject(hdc, lnghFont2) lRet = DeleteObject(lnghFont1) lRet = ReleaseDC(RichTextBox1.hwnd, hdc) If p > 0 Then sz = RichTextBox1.Text RichTextBox1.Text = Left$(sz, p) & vbCrLf & Right$(sz, Len(sz) - p) End If ※ すみません。 座標系の換算の部分で、『15』倍していますが・・・ これをどこからかAPIで取得できるはずですが、 忘れました。多分、ビデオカード等にもよりますが、 確か、『15』か『16』あたりで良かったはずです。 もし違ったら、知っている方、突っ込みお願いします。 ※ それと・・・ 掲載された、コード中の『DeleteObject』の部分で、 エラーが出る・・・とあります。これは基本的におか しいです。ちゃんと、エラーコード見て判断した方が 他に問題があったりします。 私の環境では、エラーしませんでした。 ご参考までに。 以上。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.