DrawTextExの第6引数

解決


ぞる  2002-05-08 14:27:02  No: 851

Delphi自体の質問ではなく、APIの質問になってしまうのですが、
DrawTextExの第6引数DRAWTEXTPARAMS構造体についてお聞きしたいことが
あります。

この構造体(へのポインタ)を指定した場合、処理された文字数が
uiLengthDrawnメンバで取得できるわけですが、
これはバイト数なんでしょうか?文字数なんでしょうか?
WinMeではバイト数が、WinXP(Home)では文字数がセットされるようです。
これは仕様なんでしょうか?

具体的には以下のように書きました。
var  
  Text: String;
  r: TRect;
  pDTP: PDrawTextParams;
begin
  Text:= 'あいうえお';
  r:= Rect(...);//Textが十分に収まる広さを確保

  New(pDTP);//メモリ確保
  pDTP^.cbSize:= SizeOf(pDTP^);//自身のサイズを設定

  DrawTextEx(Canvas.Handle, PChar(Text), -1, r,
             DT_WORDBREAK or DT_EXTERNALLEADING or DT_EDITCONTROL,
             pDTP);
  
  ShowMessage(IntToStr(integer(pDTP.uiLengthDrawn)));//WinMeでは10
                                                     //WinXpでは5
  Dispose(pDTP);//メモリ開放
end;

上の例では文字列が収まるようにRect構造体をセットしていますが、
実際にやりたいことは書ききれなかった文字列を取得したいのです。

OSを判定して、条件分岐すれば回避できると思うのですが、
DrawTextEx自体の使い方が間違っているのかなと思い質問させていただきました。

Delphi6(Personal)を使っています。
どうかよろしくお願い致します。


にしの  2002-05-08 21:55:30  No: 852

Microsoftのページにも特に出ていませんでした。
DrawTextExAを私用してみてはどうですか?
なんとなく、DrawTextExAとDrawTextExWで動作が違うように思えます。
今XPの環境が無いので未確認です。


ぞる  2002-05-08 22:30:12  No: 853

にしのさんレス有難うございます。
MSのページを見て下さったんですね。
誠に申し訳ないです。

なるほどDrawTextAとDrawTextWがあるのですね。
これで何とか解決できそう。。
しかし私も今XPを動かせる環境ではないので
後日改めて報告させていただきます。


にしの  2002-05-09 06:50:21  No: 854

XP Professionalで駄目でした。
原因は別にありそうです。
# APIの説明に、「文字数」とあるのが気になるところ・・・


にしの  2002-05-09 20:28:15  No: 855

NT系では、5文字、となるようです。
# 2000で確認。NT4.0は未確認

OSを判別して(GetVersionで)、NT系だったら全角を2文字として数えなおす、という方法くらいしか思いつきません。


ぞる  2002-05-09 21:00:11  No: 856

にしのさんまたまたレス有難うございます。
私も確認してみましたが、明示的にDrawTextExAとしても
やはりXPでは文字数を返すみたいです。

にしのさんのおっしゃるように、
OSを判定し、uiLengthDrawnはバイト数なのか文字数なのかを
調べて、あとの処理をしたいと思います。

NT系では5文字となることがわかりましたので、
解決とさせていただきます。有難うございました。


ぞる  2002-05-09 21:02:02  No: 857

すいません「解決」にチェック入れるの忘れてました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加