フォントの作成

さて、今まではwindowsの用意したシステムフォントを使っていましたが、
GDIオブジェクトのフォントを作成して好きな形のフォントを使ってみましょう。

CreateFontIndirect

論理フォントを作成する時、LOGFONT構造体に作りたいフォントの
文字の大きさやフォントの種類・角度などの設定を指定して、
その構造体を使ってCreateFontIndirectという関数で論理フォント作成します。
例のごとく「多重起動の防止」のソースを使いまわしています。

//==============================
//  ウィンドウプロシージャ
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
     {
     //デバイスコンテキスト
     HDC hdc ;
     PAINTSTRUCT paint ;
     //作成するフォント・以前のフォント
     HFONT hFont, hOld;
     //作成するフォントの構造体
     LOGFONT rLogfont;
     RECT rc;

作成するフォント・以前使われていたハンドルを格納する
変数hFont, hOld を宣言します。
また作成するフォントの設定に使う構造体rLogfont を宣言します。

typedef struct tagLOGFONTA
{
  LONG   lfHeight;              //フォントの高さ
  LONG   lfWidth;              //平均幅
  LONG   lfEscapement;          //文字送りの方向とX軸との角度
  LONG   lfOrientation;           //ベースラインとX軸との角度
  LONG   lfWeight;              //文字の太さ(0~1000まで・400=nomal)
  BYTE   lfItalic;               //TRUEをセットしたらイタリック体
  BYTE   lfUnderline;            //TRUEをセットしたらアンダーライン
  BYTE   lfStrikeOut;            //TRUEをセットしたらストライクアウト
  BYTE   lfCharSet;             //文字セット
  BYTE   lfOutPrecision;          //出力精度
  BYTE   lfClipPrecision;          //クリッピング精度
  BYTE   lfQuality;             //出力品質
  BYTE   lfPitchAndFamily;        //フォントのピッチとファミリー
  CHAR   lfFaceName[LF_FACESIZE]; //フォントの書体名
}
LOGFONTA, *PLOGFONTA, NEAR *NPLOGFONTA, FAR *LPLOGFONTA;

構造体の中身です。

               //構造体の指定
               rLogfont.lfHeight= 25 ;
               rLogfont.lfWidth= 0 ;
               rLogfont.lfEscapement= 0 ;
               rLogfont.lfOrientation= 0 ;
               rLogfont.lfWeight= FW_EXTRABOLD ;
               rLogfont.lfItalic= TRUE ;
               rLogfont.lfUnderline= FALSE ;
               rLogfont.lfStrikeOut= FALSE ;
               rLogfont.lfCharSet= ANSI_CHARSET ;
               rLogfont.lfOutPrecision= OUT_DEFAULT_PRECIS ;
               rLogfont.lfClipPrecision= CLIP_DEFAULT_PRECIS ;
               rLogfont.lfQuality= DEFAULT_QUALITY ;
               rLogfont.lfPitchAndFamily= VARIABLE_PITCH | FF_SWISS ;
               wsprintf(rLogfont.lfFaceName,_T("Courier New"));

rLogfont に作成するフォントの設定を入れていきます。
フォントの高さ25 というのがフォントサイズになります。
また太さをボールド体に、イタリック属性も入れています。
フォントの種類は「Courier New」にしてみました。

               //フォントを作成
               hFont = CreateFontIndirect(&rLogfont) ;
               //デバイスコンテキストにフォントを設定
               hOld = (HFONT)SelectObject (hdc, hFont);

               SetRect(&rc,0, 0,240, 240) ;
               DrawText(hdc,_T("Cool Font!"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE) ;	

               //以前のフォントに戻す
               SelectObject (hdc, hOld);
               //作成したフォントを削除
               DeleteObject (hFont);

CreateFontIndirect 関数でLOGFONT構造体を指定し、論理フォントを作成します。
その作成したフォントをSelectObject でデバイスコンテキストに設定しますが、
その祭に元のフォントのハンドルを取得しておきます。
画面に描画するなどして用が終わったら、元のフォントを
デバイスコンテキストに設定し、作成した論理フォントを切り離した後は
DeleteObjectで削除します。では実行してみましょう。

作成したフォント

いい感じですね。色を変えたり文字自体を斜めにしたりすると画面がにぎやかになるでしょう

HFONT CreateFontIndirect( const LOGFONT *lplf );
・論理フォントを作成します
第一引数 lplf には、LOGFONT構造体のポインタを指定します

戻り値 成功すれば作成した論理フォントのハンドルが、失敗ならNULL が返ります。

なおLOGFONT構造体について、他の指定方法など
詳しく知りたい方はMSDNのこちらのページをご覧下さい

ソースのダウンロード

2005/6/26


戻る