Tatsu still writes something... Fourth season

これからも私はなにかをしてなにかを書く

Windows Formsのレイアウトマネージャークラスと高DPI(.NET Framework 4.8)

自分で使う物はやっぱり気になる

高DPI用プログラムを書くにはやはり使える高DPIディスプレイがないと分からないということで

tatsu-syo.hatenablog.jp

Meiryo UIも大っきらい!!とRe-Metricsも直したわけだが、他にも気になる物がある。

MulSyncである。自作機2台、伴走用NAS役PC、気分転換+省電力な平日用Linuxノートなんて何台も使っていると任意方向の同期の他、リモートでのファイル削除のような整理、ポータブル起動による外付けHDDへのファイル同期・バックアップ・ごく簡単な整理ができる拙作MulSyncのWindows Forms版は何かと使うのだが、気になっていることがあった。

「同期設定のボタンずれてる!」

文字の大きさ100%では同期設定のレイアウトの整合性が合っていたのだが、文字の大きさ150%、144 DPIになったら思いっきりボタンの配置がずれた。

「てんで話になんねえぜ!」

てな訳で直したのがMulSync Version 2.0.5である。

では、どこがおかしかったのかについて書く。

おかしかったところはどこだ?

Windows Formsでの高DPI対応と言えばまずはフォームのスケーリング設定をDPIに設定して、起動した画面のDPIには最低限合わせるというのが定石なのだが、その定石ですら効かない物がある。

FlowLayoutPanel、TableLayoutPanelこの両名である。

こいつら、96DPIでデザインしたMinimumWidth,MinimumHeightと起動時に動作しているDPIが異なると他のコントロールが正しくレイアウトされるのに対して、とんでもなく大きな値になってしまう。

画面レイアウトの整合性を保つためにMinimumWidth,MinimumHeightを使っていたので、これが初期状態で予期せぬ大きさになった結果、MinimumWidth,MinimumHeightに押されて正常だったと思われるWidth,Heightも大きくなってレイアウトが狂ったというわけである。

そこで、次の手順を取ることでまともな値に持っていくことができた。

  1. 起動後およびリサイズ後に呼び出す画面サイズ調整ルーチンでまず、FlowLayoutPanel、TableLayoutPanelのMinimumWidth,MinimumHeightを想定する値に96 DPI時のデザイン値から算出して、適正な値に直す。
  2. FlowLayoutPanel、TableLayoutPanelのMinimumWidth,MinimumHeightに押されたWidth,Height値を画面の大きさから適正な値に直す。
  3. FlowLayoutPanel、TableLayoutPanelの中身のサイズを直す。

といった具合でFlowLayoutPanel、TableLayoutPanelのサイズを直すという実に本末転倒な作業が必要となった。何のためのレイアウトマネージャーなんだか。

この間抜けな作業、.NET Framework 4.8ベースのWindows Formだから起きる現象なのだろうか。これが仕様だとしたらいくらMVVM用のプロパティが.NET8で付こうが画面レイアウトを固定にできない不特定多数のユーザーが使うツールとしては選択肢から外れることとなる。

やはり外に見せるソフト用としてWPFで進めてる次世代版MulSync進めたいなぁ。