モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

高解像度厨が Windows 8.1 のスケーリングについてのお話を書いてみる。(4) ~ WPF で無理やりスケーリング対応する 其ノ弐

 おはようございますー、モノトーンです。

 昨日は Android binding いじってみましたが、名前空間が認識されないのか XML でレイアウトできないので挫折。まあ本気で使う気になったらもっといじる予定ですが、双方向バインディング、いつの間にかサポートしているみたいだし、Java の Linq とかそのあたりもいろいろ調べて実用的だと思ったらアプリ作るかもです。(Obj-C 書くより Java のほうがええからね。吐き気する)

概要

  1. 前回のバグの修正点
  2. 現行の不便なこと

1. 前回のバグの修正点

 今回のブログ記事は、前回の
 高解像度厨が Windows 8.1 のスケーリングについてのお話を書いてみる。(3) ~ WPF で無理やりスケーリング対応する
の続きになっておりますのでこちらをご参照ください。

 前回最後のほうにこのようにあげておりました:

既知のバグ

  • xaml で Top や Left を指定すると起動しない (よくわかりません、ウィンドウが出てこない)

  • WM_DISPLAYCHANGE の イベントが来たとき、なんかおかしくなる (誤動作防止が必要?)

 こちらが解決となりましたのでそれの報告となります。

① Top, Left が指定できない

 モニター取得系の API がなぜかうまくいかないようです。Loaded の後に呼び出すように改良することで対策しました (根本的な Per monitor 対応には関係ない)。

② WM_DISPLAYCHANGE のとき、

 WM_DISPLAYCHANGE のときの wParam つまり、wParam に dpi 情報なんて入ってないのにそれを無理やり dpi 情報と使っていてしまった、というバグです。ひどいですね^^

 以上が解決したこと、となります。

2. 現行の不便なこと

 Window の Top, Left, Height, Width が物理サイズとなり、仮想サイズでないこととなります。ただ、Per monitor dpi 対応をすると、このサイズを仮想空間で持つとなるとおかしなことになってしまいます (一様に仮想化された空間を本来的に持つことは不可能である)。これなどの理由により WPF は per monitor dpi に対応しない可能性も考えられます (このような改変は、既存プログラムを動かない可能性を秘めている)。

 故に、対応するのであればそれなりに破壊的仕様になるため対応しないのかも。(RTM で対応する可能性も低いかもしれません。実装してて気づきましたが)

総括

 公式側で対応しないのであれば、今回作った PmWindow (今記事書いてて気づいたんですけど MaxY/XDpi の対応してないやwww) を使えばいいので、使用者がきちっと理解すれば問題ないのでは (?) と思います。まあ、書いててわかった、ってことですね… うんいろいろと難しい問題でした。はい

こちらの記事もご覧ください