[HMC]年間5250円で独自ドメイン付属、ウィルスチェックありのレンタルサーバ!
Last update : 2000/09/01
演出&エフェクト 第1回
True Typeフォントを使用した文字列の描画
サンプルコードのダウンロード
  では、まずサンプルコードをダウンロードし、解凍して下さい。 私はVisual C++6.0でコンパイルしているので、をお持ちの方は Visual C++でプロジェクトファイルを開いて下さい(「effec_01.dsw」をダブルクリックすれば開けます)。 圧縮ファイルに含まれる「effec_01.exe」をダブルクリックし、実行してみて下さい(何かキーを押すと終了します)。どうでしょう?画面が切り替わり、文字が表示されると思います。 というわけで今回は、True Typeフォントを使用した文字列描画について説明したいと思います。
やっぱり苦手なGDI
  何のフォントも設定しないまま文字列を出力する方法は 「DirectDraw簡易講座 第4回」、 「DirectDraw簡易講座 第6回」 で既にやりました。今回は、True Typeを使用するという事で、フォントを作成しなければ なりません。

ではサンプルコードを順番に説明していきます。
TextOutFont関数が今回作成した自作関数です。

まず、CreateFont関数を呼び出して、フォントを作成します。書式は以下の通りです。

書式HFONT CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace ); ながっ!
nHeightフォントの高さを論理単位で指定。ドット数では無いらしい。0を指定すると、デフォルトの高さになる。
nWidthフォントの横幅を指定。0を指定すると、高さにあった横幅になる。
nEscapement文字列全体の角度を1/10度単位で指定します。
nOrientation各文字の角度を1/10度単位で指定します。とか言ってるけど、うちじゃうごかなんだ・・・。
fnWeightフォントの太さを指定します。指定する値は0〜1000ですが、400で通常、700でボールド体です。
fdwItalic1を指定すると斜体になります。
fdwUnderline1を指定すると下線が付きます。
fdwStrikeOut1を指定すると打ち消し線が付きます。
fdwCharSetフォントの文字セットを指定するらしい。よく解らないのでDEFAULT_CHARSETを指定(爆
fdwOutputPrecision出力精度を指定するらしい。よく解らないのでOUT_DEFAULT_PRECISを指定(爆2
fdwClipPrecisionクリッピング精度を指定するらしい。やっぱりよく解らないのでCLIP_DEFAULT_PRECISを指定(爆3
fdwQuality出力品質を指定するらしい。・・・よく解らないのでDEFAULT_QUALITYを指定(爆4
fdwPitchAndFamilyフォントのピッチとファミリを指定するらしい。なんじゃそりゃ!というワケでDEFAULT_PITCHを指定(爆5
lpszFaceフォント名を指定します。
戻り値成功すると、論理フォントのハンドルが返るらしい。

というように、私にも一部ワケが解りませんが(ぉぃぉぃ)、フォントが作成し終わったら、デバイスコンテキスト取得し、 「SelectObject」を呼び出しています。この関数は、指定したデバイスコンテキストにGDIのオブジェクト(フォント・ペン・ブラシ等)を 選択する(関連づけさせるというべきか・・・)ものです。この関数の戻り値は、今まで選択されていたGDIのオブジェクトです(新しくフォントを指定したら、今まで選択されていたフォントが戻り値となる)。

  こうしてTextOut関数を呼び出してやれば、設定したフォントで文字列を描画してくれるわけです。 描画し終えたら、後始末としてSelectObjectで元のフォントを選択してやります。昔この作業をサボったら動作がおかしくなったような気がしましたが 今やってみると、そんなこともありませんねぇ・・・。いらなくなったフォントとかを消す前に こうして、元のフォントをSelectObjectで選択させるというのが正しい方法なので、一応やっておいた方が良いと思います(^^;

  最後に、DeleteObject関数で、最初に作成したフォントを削除してやります。この作業をサボルと間違いなくウィンドウズはおかしくなります(爆。 ウィンドウズにはGDIリソースというのがあり、CreateFont関数のようにGDIの何かを作成する度に GDIリソースが減っていきます。このリソースは普段のウィンドウズでも使用しているため、どっかのアプリケーションでこれを使い尽くしてしまうと、 他のアプリケーションまで動かなくなるという事態が起きるので、要らなくなったら、ちゃんと消してやりましょう。
ちょっとした飾り付け
  まぁ、True Typeフォントで描画した場合、だいぶ陳腐なものになりがちですが、 影や縁を付ける事で多少ながらマシになるかもしれません(^^;

今回は、TextOutFontを並べて影を付けたりしていますが、この関数を呼ぶ毎にフォント作成したり しているので、アルゴリズム上よくないですよね?影を付ける機能なんかは、TextOutFont関数内に組み込んでしまった方が良いですね。 この辺は各自改造していって下さい(逃げ。
フォントの注意点
  True Typeフォントを使用する場合、実行するパソコンに使用するフォントがインストールされていなければ なりません。また、制作者のパソコンにフォントがあるからと言ってそれを使用した場合でも、そのプログラムを配布した先のパソコンにそのフォントがインストールされているかも解りません。 ですから、ウィンドウズに標準でインストールされているフォント以外の使用はお薦めできません。(自作のフォントなら配布出来ると思いますが(^^;)
  「MS P明朝」だとか「MS Pゴシック」ならまず入ってると思います(爆。

  また、このような問題の解決策として、絵(BMP)で描いた文字を使用するという手もあります。これもまたいつか紹介しましょうか。