最終更新日 :
VB Tips

DrawText() API

WindowsAPIの中にDrawText()というAPIがあります。 このAPIは、指定されたデバイスコンテキスト(HDC)に文字列(テキスト)を描画する関数なのですが、 この関数には単に文字列を描画するだけでなく、省略形(...)にしたり、 テキストボックスのように複数行を指定範囲内にラップして描画できたりします。

構文
Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Declare Function DrawTextEx Lib "user32" Alias "DrawTextExA" (ByVal hdc As Long, ByVal lpsz As String, ByVal n As Long, lpRect As RECT, ByVal un As Long, lpDrawTextParams As DRAWTEXTPARAMS) As Long

Public Const DT_CALCRECT = &H400 ' 実際には描画しません。採寸します。

Public Const DT_PATH_ELLIPSIS = &H4000 ' ファイルパスを省略表示します。
Public Const DT_END_ELLIPSIS = &H8000 ' 末尾を省略表示します。
Public Const DT_MODIFYSTRING = &H10000 ' 省略表示する時にかならず一緒に設定します。
Public Const DT_WORD_ELLIPSIS = &H40000 ' はっきり言って目的は不明。

省略表示をする
1.省略表示の方法を説明します。省略表示するには、まず目標とする幅が必要です。RECT構造体にその値を代入します。
RECT.Left = 適当 : RECT.Top = 適当
RECT.Right = RECT.Left + 目標幅 : RECT.Bottom = RECT.Top + 最低"|"の高さ
(当然単位はピクセル(:vbPixel)に変換すること)
2.次に、(必要に応じて)文字列が変更されてもいいように変数に文字列をキャッシュします。
Dim S As String
S = 変換対象の文字列変数
3.DrawText()を呼び出します。
DrawText hdc, lpStr, nCount, lpRect, wFormat
hdc : 描画対象のデバイスコンテキストです。(ex. Picture1.hDC)
lpStr : 描画する文字列です。(ex. S)
nCount : 描画する文字数です。(-1は文字列全部です。)
lpRect : 描画する範囲です。
wFormat : 描画フラグ(位置や省略)です。

呼び出し例: DrawText Me.hdc, S, -1, RECT, DT_CALCRECT

この関数を、次のように呼び出します。
DrawText Me.hdc, S, -1, RECT, DT_SINGLELINE Or DT_PATH_ELLIPSIS Or DT_MODIFYSTRING
(パスの省略表示の場合です。必要に応じて DT_END_ELLIPSIS や DT_WORD_ELLIPSIS を使いましょう)
描画される文字列を表示しない時は、ピクチャーボックスなどのダミーを用意しておくといいです。

この関数を実行すると、変数 S に、省略後の文字列が代入された形で入ります。

4.変数 S から省略後の文字列を取り出します。
S の中にヌル(Windowsの文字列終端マーク)があれば、省略された文字列になっていることになります。その時、
Left$(S, InStr(S, vbNullChar) - 1)
を実行すれば、省略後の文字列を簡単に取り出すことができます。

注意
クラスの文字列プロパティを直接この関数に渡す時は注意が必要です(書き換えられる時と書き換えられない時があります)。必ずキャッシュするようにした方がいいでしょう。

サンプル : drwtxt.lzh(VB5)
DrawText() APIを使用したサンプルプロジェクトです。詳しくは、Readme.txtをご覧ください。(作成 : SP3)

Copyright (C) 1998 Satoshi Tadaフィードバックはこちら
Home