ある文字列を左寄せ(横位置)・中央寄せ(縦位置)で自動折り返しありにしたいのですが、下記のように実行してもうまくいきません。
DT_SINGLELINE と DT_WORDBREAKは一緒には使えないのですか?
DrawText(Canvas.Handle, PChar(S), -1, ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_WORDBREAK);
ちなみに
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のオプションを使って実現は不可能です。
複数行中央寄せは、少々工夫が必要と思います。
レスありがとうございます。
>単にDrawTextやDrawTextExのオプションを使って実現は不可能です。
>複数行中央寄せは、少々工夫が必要と思います。
具体的には、どのようにしたら良いのですか?
サンプルコードを書いて頂けると嬉しいです。
ご教授宜しくお願いします。
サンプルコードと言われてもねぇ。
例えば)
Rectで指定された領域に文字列が表示されますよね。
ならば、条件によってTop値をずらすだけでも、見た目には縦中央寄せになる
なんてこともできますが。
いかがですか?
VCLソースコードがあればTLabelを参照してみてください。表示Rectを計算後、それをずらすことで実装してます(OffsetRect関数を使うと楽)。Syakeさんの案と同じですね。
> 書いて頂けると嬉しいです。
とありますから、サンプルコードは書きません。それほど時間がないのと、Delphiを忘れかけていますから。
たいしたアルゴリズムではありませんし、考えてみてください。
DrawTextの第5引数にDT_CALCRECTを入れておくと,テキストが収まる
矩形サイズが第4引数のARect構造体に返ってきます.
(var 渡しなので,予めARet.Top:=300のように指定も可能)
(DT_CALCRECTがある場合は,実際の描画はしません)
そこで,これを元に計算して,再度DrawTextで描画するしかないと思
いますね.
レスありがとうございます。
みなさんのアドバイスをもとに、以下のようにしたら希望通りの
動作が出来ました。
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;
ありがとうございました。
ツイート | ![]() |