TextWidthで取得したキャンバスから
フォントを斜体(イタリック体)にすると
右端がきれてしまいます。
はみ出し分をどのように計算したらいいのでしょうか。
ごまかしでよければ TextWidth(文字列の最後の文字) div 2 を足す…。
正しい方法は知りませんが、似た質問があったようです。
https://www.petitmonte.com/bbs/answers?question_id=858
参考にしてみてください。
これはABC幅というやつですね.詳しい説明は省略します.
FormにButtonを一つ配置して,以下のコードを実行してみて下さい.
なお,拙作の印刷プレビューコンポーネントの文字列描画では,この
描画方法をサポートしていません.(^_^);
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
P: PChar;
Code: UINT;
ABC: TABC;
NormalWidth: Integer;
ItalicWidth: Integer;
AHeight: Integer;
begin
S:='目的の文字列';
{普通?の書体でFormのCanvasに文字列を描画}
{その周囲に矩形を描画}
Canvas.Brush.Color := clWhite;
Canvas.Font.Size:=50;
Canvas.TextOut(20,100,s);
NormalWidth:=Canvas.TextWidth(S);
AHeight :=Canvas.TextHeight(S);
Canvas.Brush.Color := clBlack;
Canvas.FrameRect(Rect(20,100,20+NormalWidth,100+AHeight));
{Fontを斜体にして描画}
Canvas.Brush.Color := clWhite;
Canvas.Font.Style:=[fsItalic];
Canvas.TextOut(20,200,s);
{最後の文字のABC幅だけ求めればよい}
{GetCharABC...はTrueTypeFontのABC幅を求める関数}
P:=AnsiStrLastChar(PChar(S));
{最初のバイトを検査}
if P^ in LeadBytes then begin
Code:=(Ord(P^) shl 8)+Ord((P+1)^);
end else begin
Code:=Ord(P^);
end;
GetCharABCWidths(Canvas.Handle,Code,Code,ABC);
{結果は負数なので...}
ItalicWidth:=Canvas.TextWidth(S)-ABC.abcC;
{文字列描画領域に矩形を描画}
Canvas.Brush.Style:=bsClear;
Canvas.Rectangle(20,200,20+ItalicWidth,200+AHeight);
end;
end.
そういえば,たかみちえさんの指摘の質問は
正確な印字サイズを得るには?
というやつですね.今読み返してみたのですが,指定幅に描画可能な文字
のサイズをポイント数で求めたいということですが,どうやったらいいん
でしょうね.
みなさんありがとうございます。
右端が切れることなく表示されるようになりました。
少しAPIの勉強をしようとおもいます。
追加です.
ABC幅については,中村拓男さんの
Delphi Graphic Secretsの6-3 テキストフォーマッティングに詳細な説明
があります.
すみません.ちょっと不親切でしたね.
この書籍をお持ちでしたら調べているわけですよね.
中村さんの本は購入しなくても,その参考コードを入手することができ
ます.もちろん,本には詳しい解説がありますので,この際,今後のこ
とも考えて購入されることをお勧めします.
http://www.asahi-net.or.jp/%7EHA3T-NKMR/DGS/index.htm
Mr.XRAYさん、親切にご指導ありがとうございます。
ぜひご指摘の本を読んでみようと思います。
今後またわからないことがあった時に
書き込みますのでよろしくお願いします。
ツイート | ![]() |