私は、Win32 ChooseFont() API の動作が少し奇妙で、さらに重要なことに一貫性がないことを発見しました。
LOGFONT lf = { 0 };
strcopy(lf.lfFaceName, m_face_name);
const int ppi = GetDeviceCaps(pView, LOGPIXELSY);
lf.lfHeight = -MulDiv(m_font_height, ppi, 72);
CFontDialog fd(&lf);
if (fd.DoModal() != IDOK)
return;
m_face_name = fd.GetFaceName();
m_font_height = lf.lfHeight;
ただし、最初は顔の名前が「Segoe UI」であると仮定すると、これは機能します。
しかし、ユーザーがダイアログを "Segoe UI"、"Light"、"9"、(face、style、height) に変更し、上記を 2 回目にすると、フォント選択共通ダイアログで " Segoe UI」を顔の名前として使用します。代わりに、Font: フィールドが空白になります。
ユーザーが "Regular"、"Italic"、"Bold"、"Bold Italic" のスタイルを選択した場合、これらはスタイル ビットに格納されているため、これは問題ではなく、名前を変更しないでください。私はそれらを無視しているので、2回目の実行ではそれらを破棄します(フォントスタイルを無効にします:簡単に行う方法があれば-これのためにCFontDialogをサブクラス化したくありません-それはまったく別のレベルの時間です&この瞬間が許さない努力)。
ダイアログからの以前の詳細に基づいてフォントを作成しようとしましたが、そこから LOGFONT を引き戻そうとしました。サイコロはありません。
同様に、FontStyle() のダイアログを照会しようとしましたが、空白が返されるため、ここでフォント名から削除するものは何もありません...
これはMSのダイアログのバグのように思えます.1つのことを教えてくれますが、それ自体の出力を使用して2回目に正しく初期化することはできません(この状況ではLOGFONTのすべてではなく一部のみを保持しています) )。
WTHがこれに取り組んでいることを知っている人はいますか? または、私が使用する可能性のあるアプローチ(フォント名の最後にある「Light」を探すハードコーディングを除く-YUCK!)?