AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>縦書きのフォントを使う
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

縦書きのフォントを使う

 たとえば日本語で縦書きのラベルを作るとしましょう。改行等を駆使してつくればできないこともないですが、なんとも見苦しい見た目になってしまいます。Windowsには本来、角度つきの書体を作成する機能があるのですがDelphiのTCanvasではサポートされていません。
 これを実現するには CreateFont APIを使います。驚くほど簡単にできてしまいます。
procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Font.Handle :=CreateFont(0,              //フォントの高さ
                                  0,       //フォントの幅
                                  2700,           //ベースラインの角度(度の10倍)
                                  0,              //各文字の回転角度(度の10倍)
                                  FW_NORMAL,      //フォントの太さ
                                  0,              //斜体の有無
                                  0,              //下線の有無
                                  0,              //取り消し線の有無
                                  SHIFTJIS_CHARSET,
                                  OUT_DEFAULT_PRECIS,
                                  CLIP_DEFAULT_PRECIS,
                                  DEFAULT_QUALITY,
                                  DEFAULT_PITCH or FF_DONTCARE,
                                  'MS ゴシック');
 //デバイスコンテキストのグラフィックモードを変更
  SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
  Canvas.TextOut(50, 20, '縦書きで出力します。');
end;

 今回のように角度つきの書体を作成するには生のAPIであるCreateFont関数を使います。
 WindowsのGDIオブジェクトを作成する関数は戻り値にハンドルを返します。これをTFontのHandleプロパティに代入してやれば、TCanvasのメソッドでこのフォントが使えるようになります。
 はじめに、SetGraphicsMode関数でデバイスコンテキストのグラフィックモードを GM_ADVANCED に変更しています。これは、CreateFont関数のパラメータで指定できるベースラインの角度と各文字の回転角度を独立されて機能させるためです。(グラフィックモードが GM_COMPATIBLE だと各文字の回転が無視されて描画されます。)
 
 CreateFont関数の各パラメータの詳細はMSDNにでもいって確認してみてください。今回の文字の回転に関わるのは3、4番目のパラメータですが、指定しだいで色々なフォントが作れるはずです。

 最後にWindowsにはアプリケーションが作成したGDIオブジェクトはアプリケーションが責任を持って解放しなければならないという暗黙のルールがありますが、今回のように TFont のHandle プロパティに代入した場合は、作成されたGDIオブジェクトは、DelphiのGDI管理マネージャーに管理が移されますので解放の必要はありません、不必要になった時点でDelphiが責任を持って破棄します。(もちろん TPen, TBrushなどでも同様です。)