MFC CPropertySheetにおけるフォント変更の愚

 過去のCodeGuru記事にあるようにしないと、適切に任意のフォントと、それに合わせたプロパティシートのサイズにならない。SetFontなどでやれば良いなどという日本の記事が多数あるが、大体誤りである。もっとも、勘違いした人たちが悪いというより、誰かがハックしないと気づけないような設計を今の今まで残しているMFCが悪いわけだが・・・

 プロパティシートは、なにもしないとシステムフォントを強制的に使う仕様となっているため、プロパティーシートに追加するページであるダイアログを、リソースエディタで作っている時のレイアウトがあてにならない。よって、プロパティシートを使うときは、上記処理が必須となる。

 また、上記手法はモーダルプロパティシート用の処理であり、モードレスの場合については説明していないが、同様の実装でモードレスプロパティシートを用いるときにも使える。Create関数をオーバーライドし、その中で構造体にコールバック関数ポインタやフラグを渡し、ShowWindowすると適切なフォントに設定される。しかしモードレスの場合、設定したコールバック関数が呼ばれないのだが、呼ばれなくても所望の結果になる。どの文章を見ても、プロパティーページではなく、プロパティシートでもフォントを設定しなければならないと書いてあったりするが、そうでもない。

 この仕様は、システムフォントによって勝手に調整してくれるものと勘違いしやすいのだが、実際にはそんなに良いものではなく、システムフォントのサイズが大きい場合などには簡単に破綻する。なのでありがたいと思う部分がひとつもない仕様で、MFCの欠陥としか言い様がない。

 こんなものぐらいは、

sheet.Create( "font face name", size );
sheet.ShowWindow();

といったぐらいでかけるようにしておくのが普通だろう。上記処理をラップして、こういったインターフェイスにはしているわけだが、最初からそうしておけと言いたい。そもそもリソースエディタでページ自体のフォントを指定する仕様になっているのに、プロパティシートが強制的にシステムフォントをデフォルトで使う仕様になっているとか紛らわしい。