読者です 読者をやめる 読者になる 読者になる

モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

Per-monitor DPI Support Library (新) をリリースしました

 WPF 関連の更新を多々しているモノトーンです。.NET Framework 4.6 で境界線の太さの揺らぎをなくす仕組みが導入されたみたいですが、Per-monitor DPI に関してはブラックアウト領域をなくすための対応しか入っていないみたいですね。そこで、新ライブラリーを開発しました。

概要

  1. 新ライブラリーを作成した理由
  2. Per-monitor DPI Support Library の挙動について、日本語解説
  3. まとめ

1. 新ライブラリーを作成した理由

 さすがに古いバージョンは Windows 8.1 Preview のころに作成したもので、あまり情報もない状態でテキトーに作ったものをそのまま公開していてあまりにもひどい出来だったって理由もあります。

https://github.com/mntone/PerMonitorDpi

 MntoneUIFramework (C++) のほうで Per-monitor DPI について調べてそれにて蓄積した検証データをこのライブラリーにも反映するのもアリだと思ったのですが、どうせなら新しいものを作ってしまおうという考えですね。

2. Per-monitor DPI Support Library の挙動について、日本語解説

 Github に軽く解説が書いてあるのですが、これを日本語で。

2.1. 場合 1: 設定変更

 ユーザーはコントロール パネルで DPI を変更することができます。そのとき WindowsWM_DPICHANGED を投げます。

 このケースでは、DPI 変更とウィンドウサイズ変更で対応します*1

2.2. 場合 2: ウィンドウの移動

 ユーザーはキャプションバーをクリックしてウィンドウを移動することができます。そのとき Windows は DPI の変更を検知 (ウィンドウの表示領域が半分以上別ディスプレイに移ると発火します) すると WM_DPICHANGED を投げます。

 このケースでは、DPI 変更とウィンドウサイズ変更で対応します*2

2.3. 場合 3: ウィンドウのサイズ変更

 ユーザーは境界線をクリックしてウィンドウのサイズを変更することができます。そのとき Windows は DPI の変更を検知 (ウィンドウの表示領域が半分以上別ディスプレイに移ると発火します) すると WM_DPICHANGED を投げます。

 このケースでは、DPI 変更で対応します。

3. まとめ

 Per-monitor DPI Support Library は GitHubNuGet で公開しています。ライセンスは MIT です。

*1:本来は画面からはみ出てないかをチェックに加えるべきでしょう。以後の課題です

*2:本来はウィンドウサイズ変更後の期待するウィンドウ表示領域が半分以上超えるまで処理を遅延させるべきでしょう