tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルdpiについて
記事No10746
投稿日: 2012/03/15(Thu) 15:11
投稿者hoido
いつもお世話になっております。
昨日,Win7 64bitで質問させていただき、AutoScalModeをNoneに設定することにより、
dpiの変化に対応し、問題解決とさせていただきましたが、べつのプログラムではNoneで解決出来なかった為再度質問させていただきます。
96dpiのパソコンでプログラムを作成する際、サイズを546*372に設定し作成しています。
そのプログラムを,120dpiのパソコンで開くと、その時点で721*458とサイズが変わって表示されます。
2台のパソコンは同じ解像度です。
実際サイズが変わって表示されても、96:120の縦横1.25倍で表示されるのならわかるのですが、
縦横で縮尺が変わってしまいます。
縮尺がわかればその比で表示倍率も再計算出来るのかなと思うのですが、なにを元にこの縮尺は決まっているのでしょうか?
宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: dpiについて
記事No10747
投稿日: 2012/03/16(Fri) 14:23
投稿者VBレスキュー(花ちゃん)
あまり関わりたくない質問内容ですが、どなたからもレスが無いので。

> dpiの変化に対応し、問題解決とさせていただきましたが、べつのプログラムでは
>Noneで解決出来なかった為再度質問させていただきます。

> 96dpiのパソコンでプログラムを作成する際、サイズを546*372に設定し作成しています。
> 120dpiのパソコンで開くと、その時点で721*458とサイズが変わって表示されます。
AutoScaleMode = Font になっていませんか?


> 2台のパソコンは同じ解像度です。
> 96:120の縦横1.25倍で表示されるのならわかるのですが、
> 縦横で縮尺が変わってしまいます。
AutoScaleMode = DPI にした場合の話ですか。

味噌も糞も一緒くたにして話をされるとこれを見ている人にはさっぱり解りません。
(解像度が同じと言ってもそのモニタの本来の解像度なのか選択された解像度なのか?)
前回の回答で調べるべきところは、魔界の仮面弁士さんが回答されているかと思うのですが。

例えば、私の環境での計測ですが
400 × 400 のサイズの Form だけ表示するプログラムを作って計測すると
(解像度 1440 × 900  アスペクト比 16:10 )

     96dpi               120dpi
Font  400 × 400           530 × 497
NONE   400 × 400           402 × 407
DPI    400 × 400           498 × 498
(Vista 環境なので再起動が必要な為結構面倒です)

のようになります。
これを開発環境の場合と実行環境の場合でどうなるのかは調べられましたか?
又、これで違いがあるようなら、コントロールパネルの画面周りの設定の違いを
調べるとか、モニタのスペックを調べ直すとか、貴方にしか出来ない事をまず調べて
から投稿して頂かないと、判断しかねるのではないでしょうか?

[ツリー表示へ]
タイトルRe^2: dpiについて
記事No10748
投稿日: 2012/03/16(Fri) 19:59
投稿者hoido
VBレスキュー(花ちゃん)  様回答ありがとうございました。
もう少し自分の環境を調べてから再度質問させていただきます。
ありがとうございました。

[ツリー表示へ]
タイトルRe^2: dpiについて
記事No10749
投稿日: 2012/03/17(Sat) 21:21
投稿者魔界の仮面弁士
元質問者の投稿に対してではなく、あえてこの位置に繋いでみます。


> あまり関わりたくない質問内容ですが、どなたからもレスが無いので。
…関わってはみたいのですが、追跡調査が必要な質問となると、
この時期は回答する余裕が無かったりします。かといって
あまり古くなると、掲示板システムの都合上、レスできなくなるという罠。


> (解像度が同じと言ってもそのモニタの本来の解像度なのか選択された解像度なのか?)
例えば 1600x900 対応の 13.1 インチ液晶を積んだノートパソコンの場合、
最大解像度は 140dpi に相当しますね。 → (√(1600^2+900^2))÷13.1 ≒ 140.1 dpi

この場合、OS 設定が 96dpi では文字が細かすぎるため、最近はメーカー側で
120dpi(あるいは 144dpi)に設定した状態で出荷されることも珍しくありません。


あるいは、dpi 設定は変更せず、画面解像度を変更しているケースもあるでしょう。
たとえば、1600x1200 用のモニタ一杯に 1024x768 の画面を出力させると、
文字サイズは見た目上、約1.5倍の大きさで表示されます。(ただし表示はぼやけます)

かつては、96dpi でないと使い物にならないソフトが数多くあったので、
あえて解像度を下げるという対応が採られることもありましたが、現在は
OS の dpi 設定で対応するケースが増えてきているように感じます。


――閑話休題。

> 例えば、私の環境での計測ですが
調査するなら Size だけではなく、ClientSize や FormBorderStyle も
おさえておいた方が良いかと思います。

たとえば、手元の Win7 x64 環境で SystemInformation を拾うと
 [プロパティ]            [96dpi]       [120dpi]
 --------------------    ----------    ----------
 CaptionHeight           22            27
 FixedFrameBorderSize    横=3,縦=3     横=3,縦=3
 FrameBorderSize         横=8,縦=8     横=9,縦=9
となっていました。


そして、Size と ClientSize の関係というのは、FormBorderStyle の設定に応じて
【None】
 Size.Width  = ClientSize.Width
 Size.Height = ClientSize.Height

【Sizable】
 Size.Width  = ClientSize.Width  + (2 * FrameBorderSize.Width)
 Size.Height = ClientSize.Height + (2 * FrameBorderSize.Height) + CaptionHeight

【FixedSingle】
 Size.Width  = ClientSize.Width  + (2 * FixedFrameBorderSize.Width)
 Size.Height = ClientSize.Height + (2 * FixedFrameBorderSize.Height) + CaptionHeight
の関係が成り立ちます。
上下左右の枠線幅とタイトルバーの高さ分が加わるということです。



>      96dpi               120dpi
> NONE   400 × 400           402 × 407

上記は FormBorderStyle = Sizable の場合でしょうか。

もしそうなら、SystemInformation の値が私の環境と同じだとすれば、
Size と ClientSize の間には、
 横方向には 8+8 (96dpi)    または 9+9 (120dpi)
 縦方向には 8+8+22 (96dpi) または 9+9+27 (120dpi)
の差が生まれていたであろうと予測されます。

そうすると 上記の AutoScaleMode = None でテストしたときのクライアント領域は、
           96dpi           120dpi
  Size        400 × 400      402 × 407
  ClientSize  384 × 362      384 × 362
であったという事になりますよね。

見ての通り、96dpi と 120dpi とで、クライアント領域に変化がありません。
これが AutoScaleMode = None の場合の動作です。



次に、Dpi モードの場合を見てみましょう。

>      96dpi               120dpi
> DPI    400 × 400           498 × 498

こちらも実際に試してはいませんが、先と同様に算出すると、
           96dpi           120dpi
  Size        400 × 400      498 × 498
  ClientSize  384 × 362      480 × 453
というクライアント領域であったと予想されます。

384 × 362 の 1.25 倍は 480.0 × 452.5 ですから、計算値とも一致しますね。

[ツリー表示へ]