フォントの作成と選択

[ 共通フォント ] ダイアログ ボックスを使用すると、フォントを作成および選択するプロセスが簡略化されます。 アプリケーションは、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 つのタイプフェイス名があります。 CreateFont、CreateFontIndirect、および CreateFontIndirectExは、言語に一致するシステム ロケールのローカライズされたタイプフェイス名を取得しますが、他のすべてのシステム ロケールには英語のタイプフェイス名を使用します。 最善の方法は、1 つの名前を試し、失敗した場合はもう一方の名前を試す方法です。 システム ロケールがフォントの言語と一致しない場合 、EnumFonts、EnumFontFamilies、および EnumFontFamiliesExは英語のタイプフェイス名を返します。 Windows 2000 より、これは問題ではなくなりました。これは、CreateFont、CreateFontIndirect、CreateFontIndirectEx のフォントマッパーがロケールに関係なく、どちらのタイプフェイス名も認識するためです。