私は次のようなWindowsフォントを列挙しています:
LOGFONTW lf = {0};
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfFaceName[0] = L'\0';
lf.lfPitchAndFamily = 0;
::EnumFontFamiliesEx(hdc, &lf,
reinterpret_cast<FONTENUMPROCW>(FontEnumCallback),
reinterpret_cast<LPARAM>(this), 0);
私のコールバック関数には次のシグネチャがあります。
int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf,
const NEWTEXTMETRICEX *pMetrics,
DWORD font_type,
LPARAM context);
TrueTypeフォントの場合、私は通常、各顔の名前を複数回取得します。たとえば、複数の呼び出しの場合、を取得pelf->elfFullName
してpelf->elfLogFont.lfFaceName
設定し"Arial"
ます。他のフィールドを詳しく見ると、各呼び出しが異なるスクリプトに対するものであることがわかります。たとえば、最初の呼び出しでpelf->elfScript
は"Western"
、とは。pelf->elfLogFont.lfCharSet
と同等の数値になりますANSI_CHARSET
。2回目の呼び出しで、とを取得"Hebrew"
しHEBREW_CHARSET
ます。3回目の呼び出し"Arabic"
とARABIC_CHARSET
。等々。ここまでは順調ですね。
ただし、Arialのすべてのバージョンのフォント署名( )フィールドは同じです。pMetrics->ntmFontSig
実際、フォント署名は、ArialのこれらのバージョンすべてがLatin-1、ヘブライ語、アラビア語などをサポートしていると主張しています。
描画しようとしている文字列の文字セットを知っているので、フォントの署名に基づいて適切なフォントをインスタンス化しようとしています。フォントの署名は常に一致するため、ヘブライ語やアラビア語のテキストを表示する場合でも、常に「西洋」フォントを選択することになります。低レベルのUniscribeAPIを使用しているため、Windowsフォントリンクのメリットは得られませんが、コードは機能しているようです。
lfCharSet
実際に何か意味がありますか、それともレガシーアーティファクトですか?それぞれの顔のすべてのスクリプトのバリエーションについて心配するのをやめるlfCharSet
べきですか?DEFAULT_CHARSET
私の目的では、TrueTypeフォントとOpenTypeフォントのみを気にします。