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

解決


アルス  2004-02-23 02:01:40  No: 7280

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


たかみちえ  URL  2004-02-23 02:19:44  No: 7281

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

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


Mr.XRAY  URL  2004-02-23 04:06:08  No: 7282

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

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

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

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


アルス  2004-02-23 21:03:54  No: 7284

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


Mr.XRAY  URL  2004-02-25 04:29:37  No: 7285

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


Mr.XRAY  URL  2004-02-25 04:41:18  No: 7286

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

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


アルス  2004-02-25 07:44:14  No: 7287

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


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

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






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