For class and private DCs, GetDC leaves the previously assigned attributes unchanged. However, for common DCs, GetDC assigns default attributes to the DC each time it is retrieved. For example, the default font is System, which is a bitmap font. Because of this, the handle to a common DC returned by GetDC does not tell you what font, color, or brush was used when the window was drawn.」。ダイアログのウィンドウハンドルを使って得る DCが「
common DC」なのかって聞かれると自信がないけど。あるいはまだ一度も SelectFont(SelectObject)してなかっただけとか。■r3879はフォントに高さを聞いたがそれを知らない俺はリソースファイルがうまくやるやり方に従った。オーナードローコントロール以外はそれで文字が切れたりしてなかったから。カスタムDPIでもうまくやるかは知らない。■ちなみに MapDialogRect(※先のスクリーンショットに写しておきました)を使うのは3番目の(それで最後の)案で、その前には引数を4つ(left,top,right,bottom)も取らない GetDialogBaseUnitsを検討した。実際 MapDialogRectで使ってるのは bottomと topの2つだけだし、それが GetDialogBaseUnits関数は引数をひとつも取らないって言うんだから、これで間に合うならこれを使おうとするだろう。……でもひとつも? ダイアログのウィンドウハンドルもいらない? 実行コンテクストを参照してマジカルな方法で答えを返すとでも? 答えはここに>「GetDialogBaseUnits is a crock – The Old New Thing」 crockは「ナンセンス、でたらめ」という意味が何番目かに載ってる。■WM_MEASUREITEMに反応してオーナードローアイテムの高さを変える方法は邪道ではある(が、適切なデフォルトを設定しているだけだとポジティブに考えたい)。変更対象のファイルが個別のプロパティシートに対応したものではなく、基底クラスのもの(prop/CPropCommon.cpp, typeprop/CPropTypes.cpp)だということからそれが知れる。WM_MEASUREITEMは WM_INITDIALOGより前に呼ばれるから、基底クラスが派生クラスにディスパッチする仕組みが働かないんだよね(だから基底クラスのファイルに直に書いた)。これが同じ事情を説明してる>「OnMeasureItem will be called only if the control's class is created at run time, or it is created with the LBS_OWNERDRAWVARIABLE or CBS_OWNERDRAWVARIABLE style. If the control is created by the dialog editor, OnMeasureItem will not be called. This is because the WM_MEASUREITEM message is sent early in the creation process of the control. If you subclass by using DDX_Control, SubclassDlgItem, or SubclassWindow, the subclassing usually occurs after the creation process. Therefore, there is no way to handle the WM_MEASUREITEM message in the control's OnChildNotify function, which is the mechanism MFC uses to implement ON_WM_MEASUREITEM_REFLECT.」 邪道だろうがなんだろうが、ツールバータブの個別対応コードを削るだけでダイアログのフォントを正しく変更できたのだから嬉しい。「やってやったぜ!」■これはなんだろう>「Imp: ダイアログのフォント変更設定追加 · mocaskr/sakura@af39f17」 リソースからコンパイル済みのダイアログテンプレートを読み込んで、それからダイアログを作成するまでのあいだにフォント指定を書き換えるってこと? うへぇ、こんなんMS Pゴシックにも Meiryo UIにも満足できないこだわり派のユーザーも黙っちゃうよ。そうか、実行時に変更できるのか。■「履歴を読んでるだけで楽しい」とか書いていてもそれは楽しそうだ、というだけのことで、実際に読んではいなかったり。「列を指定してソート。たしか秀丸にあったことで知った機能」というのもそうだし、「ダイアログのフォントとしてMeiryo UIが指定可能」というのも、検索に引っかかって初めて気付くわけで、検索可能なオンラインのヘルプっていうのは広告塔なのだね。■ダイアログのフォント指定は言語設定と同じように特別な配慮が必要な設定だろうか。つまり、表示言語をうっかりクリンゴン語に変更してしまうとスタートレックを見たこともない自分は元の設定に戻すことさえできなくて設定画面の迷宮で途方に暮れてしまうわけだけど、ダイアログのフォント設定を間違えたり壊したりすると同じように元に戻せなくなりそうなので。※iniファイルを直接編集するという解決法は、可能であるというだけであって、利用者に求めていいことではない(俺だってやりたくない)。■実はフォント設定にからめてセキュリティフォントをからかってやろうとしたのだけど、自分の想像が及ぶ程度の素朴な仕組み(※salt付きの換字暗号)ではなかったのでやめた>「自称完璧なマイナンバー保護技術『セキュリティフォント』 その1 - Windows 2000 Blog」