カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2018年07月13日(金)

Windows API、モニター毎の DPI に合わせてウィンドウのアイコンを更新する

写真閲覧ソフトのミルノ PC フォトフレーム の修正中。
現在、メニューを「表示スケール」に対応させる作業中です。

写真をミルノに!

で覚えてね。キラーン。

今日も、高 DPI 環境に対応するための処理を
コツコツと書いてました。なんとなく
予感していた通り、結構大変です。

今日は、ウィンドウキャプション
についての記事を書きますわ〜。

まず、ウィンドウキャプションを
モニター毎の DPI に対応させるには、
アプリケーションのマニフェストに、
Per-Monitor and Per-Monitor (V2) DPI Awareness
を追加すれば OK です。

V2 のマニフェストのサンプルは
下記ページにあったので、参考にしました。

Application Manifests | Microsoft Docs
Application manifest for Per Monitor V2 · GitHub

ただし、PerMonitorV2 は、Windows 10 でしか
認識されないので、Windows 8.1 とかで、
完全に Per-monitor 環境に対応するには、
キャプションを独自で描画する必要がありそうです。

話を戻して、Windows 10 の最新バージョンで
アプリを動かす場合は、V2 のマニフェストを
用意するだけでキャプションも正しく描画されるのですが、
場合によっては、左端のアイコンがぼやけます。

というわけで、ぼやけさせたくない場合は、
キャプションのサイズに合わせた、
アイコンに更新する必要があります。

キャプションのアイコンを更新する

メインウィンドウの DPI に変更が生じた場合、
WM_DPICHANGED メッセージが発生するので、
これのメッセージハンドラーでアイコンを更新します。

キャプションのアイコンのサイズは、
GetSystemMetrics に、
SM_CXSMICON、SM_CYSMICON
を指定すると取得できます。

が、起動時の (おそらくはプライマリーモニターの) DPI に
応じた値が返るので、補正する必要があります。

起動時の DPI は ↓ のようなコードで取得できます。

CWindowDC dc(NULL);
m_systemDpis.x = dc.GetDeviceCaps(LOGPIXELSX);
m_systemDpis.y = dc.GetDeviceCaps(LOGPIXELSY);

一方、現在の DPI は、
CPoint dpis(LOWORD(wParam), HIWORD(wParam));
で取得できます。

wParam は、WM_DPICHANGED のパラメーターです。

補正するには、現在の DPI をかけてから
起動時の DPI を割れば OK です。
newValue = ::MulDiv(value, dstDpi, srcDpi);
みたいなコードになります。

で、新しいサイズでアイコンをロードしてから
再設定すれば OK です。

例えば、 LoadImage 関数 の cxDesired、cyDesired
に新しいサイズを指定して読み込み直します。

最後に、メインフレームに WM_SETICON メッセージ
を送って、アイコンを更新します。

今、更新しているのは小さい方のアイコンなので、
wParam には ICON_SMALL を指定します。

大きい方のアイコンを更新する

キャプションには直接影響しませんが、
大きい方のアイコンも合わせて
更新しておいた方がいいかもしれません。

大きい方のアイコンを更新するには、
WM_SETICON の wParam には ICON_BIG を指定します。

で、アイコンサイズの取得には、
SM_CXSMICON、SM_CYSMICON のかわりに
SM_CXICON、SM_CYICON を使います。

後の処理は、だいたい同じです。

アイコンのリソースを更新する

まだ、ぼやける場合は、たぶんリソースの問題です。

LoadImage するリソースが ico ファイルの場合は、
いろいろなサイズの画像を含めておくと、ぼやけません。

例えば、ディフォルトの 16、32 の大きさだけでなく、
20、24、48、256 なんかも用意しておきましょう。

・・・

日本語の最新版はこちらのページから、ダウンロードできます
You can download the latest version of Miruno PC Photoframe here.

x64 の最新版はこちらのページから、ダウンロードできます
Download the latest version of Miruno PC Photoframe x64 here.

・・・

月額会員専用のx64 版 もあります。
月額会員には、こちらのページから参加できます

・・・

High DPI Desktop Application Development on Windows
に WM_DPICHANGED は、both the top-level and child
にくるって書いてあるけど、嘘っぽいな。

WS_CHILD の純粋な子には、来なかった。

top-level をオーナーに持つ
ポップアップウィンドウにはきたから、
そういう意味なのかもね?

ミルノ PC フォトフレーム
ミルノ PC フォトフレームのダウンロード
ミルノ PC フォトフレームの更新履歴
ご意見・ご要望連絡窓口


コメント
コメントする