WinXP(SP2) + VC6.0
MFC:スタティックライブラリを使用
物理ディスプレイの大きさを,
GetDeviceCaps(hDC,HORZSIZE) , GetDeviceCaps(hDC,VERTSIZE)
で調べると,どうもPCによって動作が変わる模様です。
(上記hDC : GetDC(Null) で拾ってきたディスプレイのデバイスコンテキストハンド
ル)
Win2000,WinXPの旧機種では
GetDeviceCaps(HORZSIZE)=320 , GetDeviceCaps(VERTSIZE)=240
で(ディスプレイの大きさや解像度の設定に関わらず)戻り値が固定だったのが,
WinXPの新機種,WinVistaの場合は戻り値が
実際のディスプレイの大きさや解像度の設定に依存して変化するようです。
この新旧の仕様の違いは何が原因で起きているのでしょうか。
また,アプリケーションを動作させるPCが新旧のどちらの仕様に準じて動作するかを
プログラムから判別するには何を指標とするのが最も適当でしょうか。
(戻り値320,240を指標とするのは対処療法的でエレガントでない気がします。)
何か情報をお持ちの方,ご教示願います。
モニタのinfファイルやEDIDが正しく設定されているか否かじゃない?
Vistaか否かで分かれるならわからなくもないけど、XPでも一部に正しい値を帰すマシン
があるってのが謎ですな。
GetDeviceCaps が固定値を返すと言われている大多数のマシンで EDID が正しく設定され
ていないってのもなんか疑問。なんで設定しないんだか。
比較的新しいマシンということで、モニタと本体の接続がDVIになってるとか? 考えま
したけど、DDCはVGAケーブルでも使えますよね。
グラフィックカードやドライバがタコとか?
何台か正しくとれないマシンの構成(VGA、グラフィックドライバ、モニタ、接続方法等)を書いてみたらどうですか
何故、HORZSIZE、VERTSIZE で解像度が取得できるとお考えなのですか?
HORZRES、VERTRES ではない訳は何ですか?
解像度という場合はドット数を指すと思いますが xxxSIZE
誤って途中で送信してしまいました
何故、HORZSIZE、VERTSIZE で解像度が取得できるとお考えなのですか?
HORZRES、VERTRES ではない訳は何ですか?
画面の解像度という場合はドット数を指すと思いますが xxxSIZE はmm単位なので
ドット数というよりは長さです
皆様大変申し訳ありません。事実誤認がありました(以下#の行に記述します)。
# 新機種のWinXP(と言っても一台のみのテスト)は解像度に関わらず
# HORZSIZE:340, VERTSIZE:270
# で固定でした。旧機種と微妙に異なる数字です。
Win2000及び旧機種のWinXP(これも1台ずつのテスト)は先述の通り解像度に関わらず
HORZSIZE:320, VERTSIZE:240
で固定です。(ぐぐるとNT4.0~XPはこうなる旨の記述が個人ページなどに見られます。)
WinVistaも先述の通り解像度に依存します。詳細に描くと
解像度 800 × 600 → HORZSIZE:282, VERTSIZE:212
解像度 1024 × 748 → HORZSIZE:361, VERTSIZE:271
解像度 1280 ×1024 → HORZSIZE:452, VERTSIZE:361
です。
>とおりすがり様,シャノン様
旧機種とVistaのディスプレイを交換してもこの結果は変わらず,
旧機種と新機種のディスプレイを交換してもこの結果は変わりませんでした。
新機種とVistaのディスプレイの交換は試していません。
なお,PCとディスプレイの接続は全てVGAケーブルで行っています。
ディスプレイを交換しても症状が変わらないということはEDIDではないですよね。
(EDIDはディスプレイ側の属性と認識しています。)
iniファイルについては……すみません、「モニタ iniファイル」
「ディスプレイ iniファイル」でぐぐっても調査方法が分かりませんでした。
ただ,購入した時点のiniファイルを手動で書き換えるようなことはしていない筈です。
>とーりすがり様
すみません,その辺はこれから調査します。
>しま様
すみません,解像度を取得することが目的ではありません。
私の本来の目的は別スレ「SetWindowExtの動作をあらかじめ識別するには」
( http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?
print+200803/08030019.txt)
の問題を解決することです。
WinXPのバージョン違い,もしくは設定の違いでデバイスコンテキストまわりの
関数の動作が変更されているようなので,それを判定するためのフラグとして
暫定的にHORZSIZE、VERTSIZEを参照しています。
正式に使えるフラグがあれば教えて下さい,というのがこのスレの主旨です。
皆様,ご理解の程何卒お願いします。
Vista限定になりますが、GetMonitorDisplayAreaSize なんていう関数があります。
返す数字の単位が何なのか知りませんけど。
>シャノン様
ありがとうございます。将来的には考慮すべき事項かもしれません。調べてみます。
「GetMonitorDisplayAreaSize」でぐぐったら9件しか出ないですね(3/7 16:30現在)。
XPのOSのビルド番号を調べてみましたが,新旧両機種で
ビルド 2600.xpsp2_gdr.070227-2254 (Service Pac2)
と出ました。
解像度と言ってしまうとDPIのことを言うのではないかなと言う気がします。
800×600とか言うのは1画面のピクセル数ですよね。
DPIが固定ならピクセル数によって画面サイズが変わると言うのは割りとリーズナブルかも
とか思ってしまいます。
元々、Windowsでの解像度は実際の画面の解像度ではなくて画面の設定で変更できる
値を使っているのでデフォルトでは96DPIですし、120DPIに変更することも出来ます。
確か任意にも変更できたと思いますけれど。
つまりあてにならない。(^^;
で画面のサイズに関してはグラフィックドライバが返しているのではないかなぁ。
そうなるとモニタの種類はあんまり関係無いかもしれません。
VistaとXPの実装は確実に違いそうですけれど、
新旧両機種の違いはOSの方ではなくてグラフィックドライバ側の実装なのではないかと
言う気がします。
正直な話、モニタに描画するのに必要なのは一画面のピクセル数であって
実際のサイズはあまり意味が有りませんから。
あと、画面の縦横比に関してもピクセル数とDPIからではわかりそうにないです。
なにせDPIは宛になりませんし、元の物理的なモニタサイズもはなはだ当てになら無いので
元々の縦横比なんて求めようがないわけです。
とはいえ、モニタのスペックがちゃんと解っていてそれをユーザーが設定してくれるなら
計算で出せない事は無いと思います。
この辺は何処までこだわるかではないかなぁ。
>PATIO様
正しくは解像度=DPIですね。正確な言葉を用いるべきでした。
仰るとおり,新旧機種で物理ディスプレイの大きさが違うのは
OSのバージョンや設定のせいではないかも知れません。
グラフィックドライバかも知れません。
VC6.0で使える関数からグラフィックドライバの属性を参照できると良いのですが。
原因が何であれ,デバイスコンテキストまわりの関数の挙動を
特定するフラグを見つけたいのですが,
GetDeviceCapsのnIndexを0~127の値を与えて新旧のXPマシンで比較しても
それっぽいものは(HORZSIZE,VERTSIZE以外には)見つかりませんでした。
何か他に良い指標となりそうな関数はないか探しています。
今のところ,GetSystemMetrics,SystemParametersInfoなんかどうかと思っています。
テストしたらまた報告します。
他にこんな関数を使ってみては,というものがあったらご教示願います。
正直,いつもはVB使いなのでVCは暗中模索状態です。
元のスレに戻るか、元のスレの内容で新しいスレを立てるのがいいような気がします。
そもそも、当初の目的に対して、HORZSIZE、VERTSIZE を使うことが適切だったのでしょ
うか?
>シャノン様
スレに関してはご助言に従いたいと思います。
元のスレは[解決]にしてしまったので、
日にちをおいて新しいスレッドを立てようかと思います。
二週間後くらいに同僚が使っている別のメーカーの
新新XPマシンを使ってテストしても良い事になったので、
それの結果が出てからスレ立てしたいと思います。
HORZSIZE,VERTSIZEを使うことに関しては,
指標としては適切だとは思わないけれども他に指標がない,
他に良い指標はないか,というのがこのスレの一貫しての主旨です。
このスレの私の発言にそういうニュアンスが漂っていなかったとしたら,
私の文章力不足です。
とりあえず,このスレは[解決]にはせずに様子を見守ることにさせていただきます。