Written in Japanese(UTF-8)
2019.11.10
INASOFT

/トップ/目次/管理人のひとこと(ブログ)/模索中の話ですが……文字の小さい設定ダイアログを統一的かつなるべく自動的に改善できないだろうか

3130155 (+0617)[+0470]

管理人のふたこと

模索中の話ですが……文字の小さい設定ダイアログを統一的かつなるべく自動的に改善できないだろうか



公開日:2019/11/10

9月ごろの話ですが、あるアプリケーションで、ある特定のダイアログ内で表示する文字情報を拡大して表示するためだけの機能(チェックボックス)があり、感銘を受けたことがありました。仕事関係のアプリケーションなので、詳細を書いたりスクリーンショットを掲示したりはできないのいが残念ですが、40代ともなり、ちょっと目の衰えを感じてきている自分にとっては、とても重要なことなのではないかと思いました。

上記のような状況を前提にすると、従来型のアプリケーションの設定画面って、文字が小さいと思うことがあります。こんな感じの。

マウスのお供の設定ダイアログ(プロパティシート1ページ目)
▲マウスのお供の設定ダイアログ(プロパティシート1ページ目)



一般的には、こんな感じのダイアログ(プロパティシート)は一般的な姿であり、文字が小さいと思われることはありません。ただ、やはり目が衰えてくると、あるいは、目が不自由な方の場合は、これが十分な大きさと言えるのかは議論の余地があります。

おそらくこれには、歴史的事情と技術的事情の2側面があると想像しています。歴史的には、Windows 95の頃に標準的だった画面サイズ(640×480)とか、小さな画面のモバイルパソコンとの下位互換を保つ必要などから、やむなくそうなっているところはあるんじゃないかと想像。技術的には、従来型のWindowsアプリケーションでは、ダイアログボックスのサイズを、中の文字サイズごと自動で(=プログラマの手を煩わせずに)大きくするようなことができないという事情もあるんじゃないかと想像。

いや、「ダイアログボックスのサイズを、中の文字サイズごと自動で(=プログラマの手を煩わせずに)大きくする」については、厳密にはないわけではないですね。ディスプレイ設定には、モニタ単位で全てのアプリケーションのウィンドウのサイズを中身ごと変えてしまう設定があります。設定ダイアログだけでなく、全アプリケーションの全ウィンドウが対象となるのが、やりすぎなんですが。

ディスプレイ設定によるアプリケーションのウィンドウのサイズを中身ごと変える方法1 ディスプレイ設定によるアプリケーションのウィンドウのサイズを中身ごと変える方法2
▲ディスプレイ設定によるアプリケーションのウィンドウのサイズを中身ごと変える方法



Windows 10の設定の「ディスプレイ設定」の「拡大縮小のレイアウト」で、100%より大きいサイズを選びます。(横幅3000ピクセルを超えるようなモニタを使っている場合は、これが自動的に設定される場合があるっぽい)

すると、こんな感じに、ギザギザのまま無理やり引き延ばされた設定ダイアログを見ることができます。(タイトルバーなどの、システムで描画する部分はギザギザにはなっていない)

OSの設定で無理やり引き延ばされた「マウスのお供」の設定ダイアログ(プロパティシート1ページ目)ギザギザ版
▲OSの設定で無理やり引き延ばされた「マウスのお供」の設定ダイアログ(プロパティシート1ページ目)ギザギザ版



ただし、ギザギザになるのは従来型のWindowsアプリケーションのみであり、いわゆるWindowsストアアプリ的な、新しいタイプのWindowsアプリケーションでは、ギザギザにはなりません。

OSの設定で無理やり引き延ばされたWindows標準アプリのウィンドウ
▲OSの設定で無理やり引き延ばされたWindows標準アプリのウィンドウはなめらか



それと、プログラムファイルに対する互換性設定で、「高DPI設定の変更」→「高DPI設定の上書き」→「アプリケーション」が選ばれていれば、ギザギザにはなりませんが、ダイアログ上の文字が欠けたり、ウィンドウ上からはみ出したりする恐れがあります。なお、これは過去のバージョンのWindowsでの、文字サイズ設定での倍率指定時の動きのデフォルトでもありました。

互換性設定を有効にする方法 互換性設定で無理やり引き延ばされた「マウスのお供」の設定ダイアログ(プロパティシート1ページ目)
▲OSの設定で無理やり引き延ばされた「マウスのお供」の設定ダイアログ(プロパティシート1ページ目)なめらか版



また、ここでは詳細は紹介しませんが、Windows標準の「拡大鏡」アプリを使うことで、マウス周辺のみの表示を拡大することもできます。

こんな感じで、Windowsの機能で、全ウィンドウを強制的に拡大する手段はありますが、これをアプリケーションごとに行うために、プログラマができる対策はないかな?と思うことがあります。


通常の設定ダイアログ(ダイアログボックス)ならば、WM_INITDIALOGの時点で、GetWindowPos() APIでサイズを取得し、「画面サイズに対して程よいサイズになるよう」に倍率を計算し、SetWindowPos() APIで倍率をかけたウィンドウサイズに変更し、中身の子要素(文字や編集ボックス等)のフォントをWM_SETFONTで書き換えてやればよいのかなと思います。

ただ、プロパティシートの場合だと、WM_INITDIALOGの時点でサイズを変更しても手遅れなので、もっと前の段階でサイズを変更してやる必要があります。

CreatePropertySheetPage() APIはPROPSHEETPAGEを引き数に取り、その中のpszTemplateでダイアログテンプレートIDを指定しますが、dwFlagsPSP_DLGINDIRECTを指定してやれば、pResourceメモリ内のダイアログテンプレートが指定できるようになります。LoadResource() APIでダイアログテンプレートを呼び出し、ダイアログサイズとフォントサイズに「画面サイズに対して程よいサイズになるよう」な倍率をかけてやって書き換え、それを渡してやれば、いい感じのサイズになるかもしれません。

なんだか、非常に大変そうです。(そしておそらく、上で紹介した「高DPI設定の変更」→「高DPI設定の上書き」→「アプリケーション」では、OSがそれを自動でやってくれているものと思われます)

もし、2倍とか4倍とか、特定の倍率のサイズにすると決まっていたなら、ダイアログボックステンプレートをその倍率分準備するという手もありますが(それでも、ダイアログボックスの数だけ準備しなければならないのは面倒だし、今後のメンテナンスを考えるとつらい)、そもそも特定の倍率のサイズにしたいわけではないので却下。

となると、プロパティシートを使うのをやめて、例えばCtrl+マウスグリグリでサイズが変えられるような、フレキシブルなダイアログをゼロから設計しちゃった方が早いかもしれません。これもまた、非常に手間のかかる話ですが、ダイアログテンプレートを動的にいじるのと比べれば、さほど苦労に差はないような気もします。

【続き】2019/11/19 割と無理やり拡大したらうまくいったので経過報告


本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。


/トップ/目次/管理人のひとこと(ブログ)/模索中の話ですが……文字の小さい設定ダイアログを統一的かつなるべく自動的に改善できないだろうか