DrawTextの文字列について

解決


パンダ  2005-10-20 22:40:20  No: 18195  IP: 192.*.*.*

ある文字列を左寄せ(横位置)・中央寄せ(縦位置)で自動折り返しありにしたいのですが、下記のように実行してもうまくいきません。
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 08:06:30  No: 18196  IP: 192.*.*.*

ちなみに
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-21 15:34:53  No: 18197  IP: 192.*.*.*

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

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

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

編集 削除
Syake  2005-10-21 16:07:11  No: 18198  IP: 192.*.*.*

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

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

編集 削除
たかみちえ  URL  2005-10-21 19:07:26  No: 18199  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  URL  2005-10-22 00:01:43  No: 18200  IP: 192.*.*.*

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

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

編集 削除
パンダ  2005-10-22 01:51:49  No: 18201  IP: 192.*.*.*

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

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

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;

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

編集 削除