フォントの作成と選択

[ フォント の共通] ダイアログ ボックスを使用すると、フォントを作成して選択するプロセスが簡略化されます。 CHOOSEFONT 構造体を初期化し、CHOOSEFONT 関数を呼び出すことで、アプリケーションは、以前に多くの行のカスタム コードを必要としていたのと同じフォント選択インターフェイスをサポートできます。 ( フォントの共通 ダイアログ ボックスの詳細については、「 共通ダイアログ ボックス ライブラリ」を参照してください)。

ユーザーによる選択

ほとんどのフォントの作成と選択の操作には、ユーザーが含まれます。 たとえば、ワープロ アプリケーションでは、見出し、脚注、本文の一意のフォントを選択できます。 ユーザーが [ フォント ] ダイアログ ボックスを使用してフォントを選択し、[ OK] ボタンを押すと、 CHOOSEFONT 関数は、要求されたフォントの属性を使用して LOGFONT 構造体のメンバーを初期化します。 このフォントをテキスト出力操作に使用するには、アプリケーションで最初に論理フォントを作成してから、そのフォントをデバイス コンテキストで選択する必要があります。 論理フォントは、アプリケーションが提供する理想的なフォントの説明です。 開発者は、CreateFont 関数または CreateFontIndirect 関数を呼び出して論理フォントを作成できます。 この場合、アプリケーションは CreateFontIndirect を呼び出し、CHOOSEFONT によって初期化された LOGFONT 構造体へのポインターを指定します。 一般に、 CreateFontIndirect を呼び出す方が効率的です 。CreateFont には複数のパラメーターが必要ですが 、CreateFontIndirect はLOGFONT へのポインターを 1 つだけ必要とするためです。

アプリケーションが論理フォントを使用してテキストの描画を実際に開始するには、デバイスに内部的に格納されているフォントと、オペレーティング システムにリソースが読み込まれているフォントから最も近い一致を見つける必要があります。 デバイスまたはオペレーティング システムに格納されているフォントは、 物理フォントと呼ばれます。 指定された論理フォントに最も近い物理フォントを検索するプロセスは、フォント マッピングと呼ばれます。 このプロセスは、アプリケーションが SelectObject 関数を呼び出し、論理フォントを識別するハンドルを提供するときに発生します。 フォント マッピングは、要求された論理フォントの属性と使用可能な物理フォントの属性を比較する内部アルゴリズムを使用して実行されます。 フォント マッパー アルゴリズムが検索を完了し、最も近い一致を決定すると、 SelectObject 関数が返され、アプリケーションは新しいフォントでテキストの描画を開始できます。

SetMapperFlags 関数は、フォント マッパー アルゴリズムが、物理デバイスと一致する縦横比を持つ物理フォントのみを検索するかどうかを指定します。 デバイスの縦横比は、そのデバイス上のピクセルの幅と高さによって形成される比率です。

システム フォント (シェルまたは既定のフォントとも呼ばれます) は、タイトル バー、メニュー、ダイアログ ボックスのテキストに使用されるフォントです。

フォントの選択に関する特別な考慮事項

ほとんどのフォント選択操作にはユーザーが含まれますが、これが正しくない場合もあります。 たとえば、開発者は、アプリケーションで一意のフォントを使用して、コントロール ウィンドウにテキストを描画することができます。 適切なフォントを選択するには、アプリケーションで使用できるフォントを決定し、これらの使用可能なフォントの 1 つを記述する論理フォントを作成し、そのフォントを適切なデバイス コンテキストに選択できる必要があります。

アプリケーションでは、 EnumFonts 関数または EnumFontFamilies 関数を使用して、使用可能なフォントを列挙できます。 EnumFontFamilies は、ファミリ名に関連付けられているすべてのスタイルを列挙するため、推奨されます。 これは、多くのスタイルまたは通常とは異なるスタイルのフォントや、国境を越えるフォントに役立ちます。

アプリケーションが使用可能なフォントを列挙し、適切な一致を見つけたら、フォント列挙関数によって返される値を使用して LOGFONT 構造体のメンバーを初期化する必要があります。 その後、 CreateFontIndirect 関数を呼び出し、初期化 された LOGFONT 構造体へのポインターを渡すことができます。 CreateFontIndirect 関数が成功した場合、アプリケーションは SelectObject 関数を呼び出して論理フォントを選択できます。 LOGFONT 構造体のメンバーを初期化するときは、lfCharSet メンバーに特定の文字セットを指定してください。 このメンバーはフォント マッピング プロセスで重要であり、このメンバーが正しく初期化されていない場合、結果は一貫性がありません。 LOGFONT 構造体の lfFaceName メンバーに書体名を指定する場合は、lfCharSet 値が lfFaceName で指定された書体の文字セットと一致していることを確認してください。 たとえば、MS Mincho などのフォントを選択する場合、 lfCharSet は定義済みの値SHIFTJIS_CHARSETに設定する必要があります。

多くの東アジア言語のフォントには、英語名とローカライズされた名前の 2 つの書体名があります。 CreateFontCreateFontIndirectCreateFontIndirectEx は、言語に一致するシステム ロケールのローカライズされた書体名を受け取りますが、他のすべてのシステム ロケールの英語の書体名を受け取ります。 最善の方法は、一方の名前を試し、失敗した場合はもう一方の名前を試してみる方法です。 システム ロケールがフォントの言語と一致しない場合、EnumFontsEnumFontFamilies、EnumFontFamiliesEx は英語の書体名を返します。 Windows 2000 以降では、CreateFont、CreateFontIndirectCreateFontIndirectEx のフォント マッパーがロケールに関係なくいずれかの書体名を認識するため、これは問題ではなくなりました。