DrawTextの文字列について

解決


パンダ  2005-10-21 07:40:20  No: 18195

ある文字列を左寄せ(横位置)・中央寄せ(縦位置)で自動折り返しありにしたいのですが、下記のように実行してもうまくいきません。
DT_SINGLELINE と DT_WORDBREAKは一緒には使えないのですか?

DrawText(Canvas.Handle, PChar(S), -1, ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_WORDBREAK);


Syake  2005-10-21 17:06:30  No: 18196

ちなみに
DT_SINGLELINEとDT_WORDBREAKを、単一文字列に対して両方指示されたら
パンダさんどうします。

これはさておき、DT_VCENTERはDT_SINGLELINE以外では無効です。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_drawtext.asp

単にDrawTextやDrawTextExのオプションを使って実現は不可能です。
複数行中央寄せは、少々工夫が必要と思います。


パンダ  2005-10-22 00:34:53  No: 18197

レスありがとうございます。

>単にDrawTextやDrawTextExのオプションを使って実現は不可能です。
>複数行中央寄せは、少々工夫が必要と思います。
具体的には、どのようにしたら良いのですか?
サンプルコードを書いて頂けると嬉しいです。

ご教授宜しくお願いします。


Syake  2005-10-22 01:07:11  No: 18198

サンプルコードと言われてもねぇ。

例えば)
Rectで指定された領域に文字列が表示されますよね。
ならば、条件によってTop値をずらすだけでも、見た目には縦中央寄せになる
なんてこともできますが。
いかがですか?


たかみちえ  URL  2005-10-22 04:07:26  No: 18199

VCLソースコードがあればTLabelを参照してみてください。表示Rectを計算後、それをずらすことで実装してます(OffsetRect関数を使うと楽)。Syakeさんの案と同じですね。
> 書いて頂けると嬉しいです。
  とありますから、サンプルコードは書きません。それほど時間がないのと、Delphiを忘れかけていますから。
たいしたアルゴリズムではありませんし、考えてみてください。


Mr.XRAY  URL  2005-10-22 09:01:43  No: 18200

DrawTextの第5引数にDT_CALCRECTを入れておくと,テキストが収まる
矩形サイズが第4引数のARect構造体に返ってきます.
(var 渡しなので,予めARet.Top:=300のように指定も可能)
(DT_CALCRECTがある場合は,実際の描画はしません)

そこで,これを元に計算して,再度DrawTextで描画するしかないと思
いますね.


パンダ  2005-10-22 10:51:49  No: 18201

レスありがとうございます。

みなさんのアドバイスをもとに、以下のようにしたら希望通りの
動作が出来ました。

procedure TfrmTest.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
  with StringGrid1 do begin
    Canvas.FillRect(Rect);
    OffsetRect(Rect,0, 8);
    DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]),-1, Rect, DT_LEFT or DT_WORDBREAK);
  end;
end;

ありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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