あさりのみそしるダイアリー

ココロおだやかに暮らしてます😌

ぷれます!Ver.0.40a

今日のネタね、これ(え?

ぷれます!のDPI問題ですが、あっさり解決しました。
けっこう時間かけたのですが・・・


前回のエントリー、つまり何が問題だったのかというと、

イメージ 1

ディスプレイのカスタマイズで「テキスト、アプリ、その他の項目のサイズを変更する」を変更していたことが問題でした。

ディスプレイ2~4は100%なのですが、4Kディスプレイのディスプレイ1だけ、100%だと文字が小さすぎるので、150%に拡大していました。

そのため、複数のDPIが混在する環境になってしまい、ディスプレイ2~4では正しくマウスカーソルの位置にポインタがくるのに、ディスプレイ1だけ、マウスの位置よりも1.5倍ほど遠くにポインタが表示されてしまっていました。

結論を言うと、High DPIに対応したアプリケーションであるという宣言をすれば、よかったらしいです。たぶん。

どうにもならんので、グーグル先生で「C# ディスプレイ 拡大率」で検索したら、ほぼ答えのようなものが返ってきました。やっぱり調べ方って大事ですね。

一番参考にしたのがココ。

○ Windows 8.1 で加わった Per-Monitor DPI と WPF での対応方法 | grabacr.nét

まったく同じ問題を取り扱っています。なんと!

Windows 8.1から、マルチディスプレイ環境においてディスプレイごとに異なるDPIを指定できるようになったそうで、Win7では仕様上発生しない問題が、ここで顕在化してしまいました。

とりあえず今回やった対応は、プロジェクトにapp.manifestを新規追加して、下の方にある

  <!-- アプリケーションが DPI 対応であり、それ以上の DPI で Windows によって自動的にスケーリングされないことを
       示します。Windows Presentation Foundation (WPF) アプリケーションは自動的に DPI に対応し、オプトインする必要は
       ありません。さらに、この設定にオプトインする .NET Framework 4.6 を対象とする Windows Forms アプリケーションは、
       app.config ファイルで 'EnableWindowsFormsHighDpiAutoResizing' 設定を 'true' に設定する必要があります。-->
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
    </windowsSettings>
  </application>

のコメントアウトをはずして、dpiAware(これが重要なキーワード)の値を「True/PM」に書き換えました。これでひとまず解決しました。


ただ、この場合、拡大率が適用されないので、細かい表示になってしまいますが、4Kディスプレイ使ってない人には問題ないし、カーソルや複製ディスプレイの表示がおかしくなりまともに使えないことに比べたらはるかに小さな問題なので、これでよしということにしました。

たぶん、DPI変更通知とか受け取って、ディスプレイをまたぐときにフレキシブルに対応できるようにコーディングすれば、見た目拡大率が適用されて、見やすさが改善するのかもしれませんが、見た目は今は重要な問題ではなく、機能を盛り込みつつ、それがちゃんと動作する方が、今は重要というスタンスでやっているので、ま、そういうことで(´・ω・`)


イメージ 2

まぁ、でもこれで堂々とVer.0.40aが公開できますので・・・

マウスポインターは、ツールボックスで「Pointer」を選ぶと表示されます。マウスを動かすと引っ付いてくるがポインターです。
ポインター表示中も、線を引いたり、どこかをクリックしたりと、普通にマウス操作できます。
もう一度「Pointer」ボタンをクリックするか、アプリを終了すると、消えます。

例によって見た目のカスタマイズは「まだ」できません。


今回から、自作ライブラリが同梱されています。
これがないとちゃんと動かないので、すべてセットで展開してください。

それから、タイトルも「ぷれます!~プレゼンマスター~」にしました。
えっ?アイマス?ぷちます?
違うけど(´・ω・`)

次は画面の保存ですね。静止画と動画。
静止画保存は、ほぼ終わったようなものですけどね。
複製ディスプレイ作成時にビットマップ形式でメモリに落としてますし。
これの保存先をファイルにすればいいだけです。

だんだんとVer.1.00に近づいていますね。
静止画・動画対応ができたら、とりあえずVer.0.50aにします。

ちなみに、実行ファイルのバージョン番号の末尾が「79」になっていますが、これは79回ビルドしたということです。
勝手にインクリメントしてくれるVisual Studioのアドイン「Automatic Versions」を使ってみました。

マウスポインタ実装でかなりビルド番号が増しました。。。
トライ&エラーの連続でしたね。



さて、明日は仕事(´・ω・`)
しかも本社です。電車移動。普通に忘れそうで怖いんですが・・・(フラグ?

あさり、ふぁいおー!(´・ω・`)