2

私は、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!)?

4

2 に答える 2

4

フォント デザインの開発は、従来の API の能力を大幅に上回っています。たとえば、OpenType が発生しました。LOGFONT がサポートできる以外の追加のフォント スタイルがあります。Segoe UI の場合、太字を制御するプロパティは Light と Semibold です。他のフォントの場合、フォント ストレッチは別のプロパティです。一般的なものは Condensed と Expanded です。フォントは専用のフォント ファイルを実装してこれらのスタイルの見栄えを良くすることができ、昔のように既存のフォントからスタイルを合成することに依存しません。可能な値については、WPF FontStretch および FontWeight 列挙型を確認してください。

これらは、LOGFONT では表現できないプロパティです。これに対処するための互換性ハックがあり、タイプフェイス名がマップされます。したがって、「光」のスタイルを持つ「Segoe UI」は「Segoe UI Light」になります。Windows フォント マッパーは、そのような名前から適切な TrueType フォント ファイルを選択します。ただし、機能しないのは、LOGFONT.lfFaceName を「Segoe UI Light」で初期化することです。理由はよくわかりませんが、あいまいさに対処する必要がないことを回避したのでしょう。または、単なるフラブ。考えられる回避策は、フォント フェイス名に追加されたスタイル名を認識することですが、これも完璧ではありません。

GDI のガスが不足しています。User32 によく似ています。

于 2012-06-02T00:57:06.193 に答える
-1

まず、proc で LOGFONT を初期化するときに、単純に 0 に設定することはできません。

ala "= { 0 };"

次のようなものを使用します

memset(&lf, 0, sizeof(lf));

そうしないと、proc の lf にランダムながらくたが含まれます。次に、LOGFONT 構造体のすべての設定を保存しないことの何が問題なのでしょうか? MFC を使用している場合、それはオーバーヘッドが大きすぎるためではありません。lf の初期化を修正してもうまくいかない場合は、LOGFONT 全体を保存してください。

于 2012-06-01T19:25:55.000 に答える