C#2.0時代のゲームプログラミング(36)

(昨日の続き)


■ dpi変更の影響の受けそうな場所


たいていのアプリで使われているであろう、Windows.Form , Font , DrawImage等もdpi変更の影響を直接受ける。


以下に、私が理解しているところをざっとまとめる。間違っていたらコメント欄で教えて欲しい。


■ Windows.Form


Form の AutoScaleMode が Noneになっていなければ、上記のdpiの変更の影響を受ける。

Location や Size がdpi設定の影響を受けて欲しくないのであれば、Form の AutoScaleMode を None にするのが原則。


■ Font


Fontは、ピクセルで指定するのか、ポイントで指定するのか。ポイントを指定する場合は、dpi設定の影響を受ける。


以下の記事によると
http://www.microsoft.com/japan/msdn/windows/windowsxp/FixedPitchFont.asp


Windows(R) オペレーティング システムでは、GDI (Graphics Device Interface) モジュールが、
画面への描画とプリンタでの印刷の管理を行っています。この GDI 内部では、
フォントのサイズはピクセル (プリンタの場合ドット) の単位で扱われます。
例えば、アプリケーション上で 15 ポイントのサイズのフォントを選択した場合、
96 dpi の画面上では、以下の計算により、20 ピクセルのフォントが使用されます。
20 (ピクセル) = 15 (ポイント) × 96 (dpi) / 72

ということなので、デフォルト(96dpi)で nポイントのフォントを使う場合、
フォントのピクセルサイズは
pixel = n * 96 / 72
ピクセルになります。

だそうだ。Fontのコンストラクタにはピクセル単位でのフォントサイズ指定があるので


float pointSize = 10;
float pixelSize = pointSize * 96.0f / 72.0f;
Font f = new Font( fontname, pixelSize, GraphicsUnit.Pixel );

とやれば、DPIに関係なく同じサイズで描画できる。


■ Bitmap


Graphics.DrawImageは転送元から転送先へ画像を転送するメソッドだが、当然、転送元と転送先と両方のdpi設定の影響を受ける。


転送元のdpi設定とは、読み込んだ画像に事前に設定されているdpiの値である。
転送先のdpi設定とは、上記のdpi設定で変更されうる値である。


転送元のdpi設定の値を無視したいのであれば、DrawImageの引数で画像のwidthとheightを指定してやる必要がある。


また、転送先のdpiに依存したくないのであれば、GraphicsUnit.Pixelを指定してやる。転送の都度設定するのは大変なので、.NET Frameworkの描画部分はwrapして使うのが良いだろう。