[ttssh2-dev 254] Re: 使われるアイコンのサイズについて

Back to archive index
matsuo zmats****@gmail*****
2022年 2月 18日 (金) 01:10:47 JST


松尾です。

 > 現在、アイコンの高 DPI に対応できているのは Tera Term と TTSSH の
 > About ダイアログだけのようです。

そうですね。
ダイアログ上に表示しているアイコンのDPIを調整する部分だけですね。
ダイアログ上の画像はicoに入っていて、
DPIに応じて適切なサイズのものを表示する、
という感じです。


システムに利用されるアイコンは
大と小の2つをセットすることができて、
次のところで使われているそうです。

- 使用されるアイコン(予想)
   - 大きなアイコン(100%時32×32 , WM_SETICON + ICON_BIGでセットする)
     - タスクバーのアイコン
     - タスクの切り替え(Alt + Tab)でのアイコン
     - タスクビュー(Windows ロゴ キー + Tab)でのアイコン
   - 小さなアイコン(100%時16×16, WM_SETICON + ICON_SMALLでセットする)
     - アプリのウィンドウのタイトルバーのアイコン

タスクマネージャなどで表示しているアイコンは
exeファイルから画像を取り出しているのではないか予想です。
(WM_GETICONで他のアプリのアイコンを取り出せるのだろうか?)

タイトルバーのアイコンはウィンドウのいるディスプレイに合わせて
アイコンを設定するのがよさそうです。

今は起動したときだけアイコンをセットしているので
- ウィンドウを生成したとき
- WM_DPICHANGED を受信したとき(解像度が変わったとき)
でアイコンをセットすればよさそうです。

解像度に大きな差があるマルチディスプレイ環境だと
タスクバーのアイコンがざらざらに見えたり
小さく崩れたりしそうな気はします。

https://nishy-software.com/ja/dev-sw/windows-high-dpi-desktop-app-5/
このページの説明によると、
大きなアイコンは、
メインディスプレイのDPIスケール率に対応したサイズの
アイコンを利用するのがよい、
とのこと。
どうしたものでしょうか。テストが必要そうです。

とりあえず解像度が変わったときどうするかは、
ダイアログ上のアイコン表示と同じ作戦で
   SetDlgItemIcon()@dlglib_cpp.cpp
okじゃないかと思います。

流れはこんな感じ。
- ウィンドウのいるモニタを調べて
- モニタの解像度をしらべて
   - ↑2つ、GetMonitorDpiFromWindow()@ttlib_static.c
- 解像度に合わせたアイコンサイズを調査して
- LoadIconWithScaleDown() でロードして
   - ↑2つ TTLoadIcon()@dlglib_cpp.cpp
- アイコンをセットする
   - 必要なら古いアイコンを破棄
   - WM_SETICON + ICON_SMALL でセット
   - WM_SETICON + ICON_BIG ★これもやるべきか?


通知領域(システムトレイ)のアイコンは、
ttxssh以外の時は、
WM_GETICON + ICON_SMALL で取ってきているので 16pixelになるのかな。
   CreateNotifyIcon()@teraterm/ttpcmn/ttcmn_notify.cpp 192行目付近
ttsshの時は、
ttsshアイコン(サイズ0を指定しているのでディスプレイに合わせたサイズ?)
   ttssh2/ttxssh/ttxssh.c 705行目付近
になると思います。
通知領域はプライマリディスプレイだけなので(確かそうだったはず)
通知領域用の解像度がありそうですね。

なかなかボリュームがありそうです。



ttssh2-dev メーリングリストの案内
Back to archive index