フォントの斜体の右端がきれてしまう

解決


アルス  2004-02-23 02:01:40  No: 7280  IP: [192.*.*.*]

TextWidthで取得したキャンバスから
フォントを斜体(イタリック体)にすると
右端がきれてしまいます。
はみ出し分をどのように計算したらいいのでしょうか。

編集    削除
たかみちえ  URL  2004-02-23 02:19:44  No: 7281  IP: [192.*.*.*]

ごまかしでよければ TextWidth(文字列の最後の文字) div 2 を足す…。

正しい方法は知りませんが、似た質問があったようです。
https://www.petitmonte.com/bbs/answers?question_id=858
参考にしてみてください。

編集    削除
Mr.XRAY  URL  2004-02-23 04:06:08  No: 7282  IP: [192.*.*.*]

これは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.

編集    削除
Mr.XRAY  URL  2004-02-23 04:35:54  No: 7283  IP: [192.*.*.*]

そういえば,たかみちえさんの指摘の質問は

正確な印字サイズを得るには?

というやつですね.今読み返してみたのですが,指定幅に描画可能な文字
のサイズをポイント数で求めたいということですが,どうやったらいいん
でしょうね.

編集    削除
アルス  2004-02-23 21:03:54  No: 7284  IP: [192.*.*.*]

みなさんありがとうございます。
右端が切れることなく表示されるようになりました。
少しAPIの勉強をしようとおもいます。

編集    削除
Mr.XRAY  URL  2004-02-25 04:29:37  No: 7285  IP: [192.*.*.*]

追加です.
ABC幅については,中村拓男さんの
Delphi Graphic Secretsの6-3 テキストフォーマッティングに詳細な説明
があります.

編集    削除
Mr.XRAY  URL  2004-02-25 04:41:18  No: 7286  IP: [192.*.*.*]

すみません.ちょっと不親切でしたね.
この書籍をお持ちでしたら調べているわけですよね.
中村さんの本は購入しなくても,その参考コードを入手することができ
ます.もちろん,本には詳しい解説がありますので,この際,今後のこ
とも考えて購入されることをお勧めします.

http://www.asahi-net.or.jp/%7EHA3T-NKMR/DGS/index.htm

編集    削除
アルス  2004-02-25 07:44:14  No: 7287  IP: [192.*.*.*]

Mr.XRAYさん、親切にご指導ありがとうございます。
ぜひご指摘の本を読んでみようと思います。
今後またわからないことがあった時に
書き込みますのでよろしくお願いします。

編集    削除