ミニタイマー(8) - アイコン・HighDPI

公開:2011-05-03 21:31
更新:2020-02-15 04:36
カテゴリ:windows,その他api,ミニタイマー,windows 7,c++

アイコン

昨日書いたとおり、OS上で表示されるアイコンはリソースで持たないといけないということで、まずはアイコンについて調べてみたが、かなり奥が深い。Windows95からXP、Vista、Windows7とOSの進化とともにアイコンも進化していることを今日初めて知った。

icoファイルフォーマットだけどWikipediaに詳しく載っている。

ICO

MSDNのIconsというドキュメントも内容は古いが参考になる。

http://msdn.microsoft.com/en-us/library/ms997538.aspx

要するにicoファイルはOSのアイコン表示の要求に合わせて最適なサイズを拡大・縮小して表示できるように、サイズの異なる複数のビットマップを持てるようになっている。Windows 7では256×256ピクセル・32bitアルファビットマップをサポートしており、ビットマップのフォーマットは圧縮png形式もサポートしている。256×256のビットマップってどこで使うのだろうと思ったら、大アイコン表示の時に使われるようだ。

またUXガイドラインにアイコン作成のガイドラインが載っている。これによればWindows7ではアプリケーションアイコンは16 × 16、32 × 32、48 × 48、256 × 256のビットマップを用意する必要がある。これを1つのicoファイルにまとめてリソースにセットすれば良さそうだが、普通のVSのリソースエディタでは対応していないようである。私の場合そもそもExpress Editionなのでリソースエディタすら無いのであるが。

Windows 7のアイコン作成に使えるエディタはないかと探していたらIcoFXというのを見つけて、今試しているところだ。絵心が無いので256x256のアイコンはきついが、頑張って作ってみることにする。

アイコンについてはアイコンオーバレイとかあんまり知らない機能もあるので引き続き調べるつもりだ。

High DPI

今つくっているアプリにはあまり関係がないような気もするが。。昨今のディスプレイの高解像度化に伴いDPI値が上がってきている。決まったディスプレイの大きさで高解像度を実現しようとするからだ。私がDPIを意識していた頃は72が普通であった。またWindowsでは最初はDPIの意識がなく、Macでよく語られていたことだった。なぜかというとMacはDTPでもよく使われていたので、モニタは実物のドキュメントと同じ大きさで表示させる必要があったのだ。今はWindowsでもDPIは意識され、Vista以降では96DPIと120DPIが標準となっている。DPIをあまり意識せず実ピクセルでアプリを設計するとDPI値が変わるとモニタで見たウィンドウの大きさが変わったり、テキストがきちんと表示されないなど不都合が生じる。具体的には下記ドキュメントに詳しく載っている。

高 DPI 対応の Win32 アプリケーションを記述する

Windows 7 アプリは現在のDPI値にしたがって実際に見えるウィンドウの大きさを揃えなくてはいけない。つまり96DPIでも120DPIでも画面に定規をあてて測れば同じサイズとなるようにつくらなくてはならない。

最近のAPIはDPIを考慮されているので意識する必要はないが、古いものは考慮されていないのでアプリ側で調整してやる必要がある。

でも開発の終わった枯れた古いアプリで、DPIに対応していないものだとどうなるのかだけど、一応Windows7にはDPIが変化しても対応できるようにDPI仮想化機能があり、デフォルトで有効になるようだ。でもこれが逆に問題になる場合もあるようで、そういう場合は無効にできるようになっている。

そういうわけでWindows APIの奥深さというか複雑さを実感している今日この頃である。この程度で奥深いとかいっていると叱られそうな内容かもしれないけれども。