/ 最近 .rdf 追記 編集 設定 本棚

脳log[20161226]



2016年12月26日 (月) [SakuraEditor] ダイアログのフォントがMS Pゴシックの 9(単位はポイント?)なんだけど、これを刷新したい。検索文字列だとか、タイトルバー文字列のフォーマットだとか、タイプ別設定の拡張子リストだとか、特に入力欄の文字が米粒で、ノートパソコンのコントラストの低い液晶で判読できないのがつらい。■リソースファイルっていうのは(仕組みは知らないけど)良くできたもので、「FONT 9, "MS Pゴシック"」という行を軒並み「FONT 12, "Meiryo UI"」に書き換えるだけで大体はうまくいく(みたい)。ひと手間必要だったのはオーナードローのリストボックスで、それも WM_MEASUREITEMを処理するだけのこと。■ネガティブ要素はいろいろあるよ。XPと Vistaにはデフォルトで Meiryo UIがインストールされていないとか、設定ダイアログの縦が 730ピクセル程度(@96DPI)になるせいで、800×600程度の画面(最初のパソコンの 15インチブラウン管モニタがこれだった)では使えなくなるとか。でも「自分の」環境では問題がないのがわかっていれば、もう戻れないくらい見違えるんだよ>MeiryoDialog.png(118KiB)。■徹底するならツールバーとかタブコントロールのタブの文字サイズを変更する手段を講じる必要があるし、一部のダイアログ(FileOpen/FileSaveの他にもたぶん気付いてないものが)はリソースファイルの数字をいじる必要があるらしくちょっと表示が狂ったりはみ出たりしてる。■■■@2016-12-27 最新の trunk2では問題ないけど、2.0.3.1ベースでは共通設定のツールバータブのリストビューの項目サイズだけが、WM_MEASUREITEMに答えてもフォントのサイズに合ってなかった。まさにコレ>「[r3879] Fix: 共通設定-ツールバーのリストボックスの高さが正しく設定されない」。正しくない値が WM_MEASUREITEMより後の2か所で求められ設定されていた。旧版は自分が WM_MEASUREITEMに反応するために最初に書いたコードとそっくり同じだ。たぶんこういうことなんだろう>「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