どうやっているのでしょう?(’14/8)


VC++にGetDevicecapsという関数があります。Windowsが設定している色々なデバイスの
情報を取得するためのAPIです。プログラムにおける指定は、例えば

  HDC hDC; //デバイスコンテキストハンドル
  int iValue;

  iValue = GetDeviceCaps(hDC, iIndex);
で、このiIndexに規定定数を入れればその情報が得られます。

ここで、画面の解像度を知りたいとき、iIndexをHORZRESとすると水平解像度が得られ、
VERTRESとすると垂直解像度が得られます。プログラムを実行すると、私のPCではちゃん
と、水平解像度=1920、垂直解像度=1080と示されます。

で、これは不思議でも何でもないのですが、これとは別に「画面の物理サイズ(mm単位)」
を取得する定数があるのです。それは、HORZSIZEVERTSIZEというもので、前
者を指定すると画面の水平方向サイズ、後者を指定すると画面の垂直方向サイズが取得
できるとされています。

これって、ちょっと考えると不思議ではないでしょうか?モニターはユーザが勝手に選んで
いるわけで、Windowsでそんな項目の設定入力などしていませんよね?
で、今、整理が悪くてちょっとどこかに紛れ込んでしまっている私の所有する2003年頃購入
した(もう絶版か?)マイクロソフト出版のwindowsプログラミングというネイティブAPIでの
VC++のプログラミングの本では、どうやっているかの説明がありました。
計算で求めているという説明でした。前述のiIndexにLOGPIXELXと入れると、水平方向の
dpi値(ピクセル数/インチ)が、LOGPIXELYと入れると、垂直方向dpi値が得られます。
確か以前は「小さいフォント」「大きいフォント」という二つのWindows画面の文字サイズ表示
設定がユーザ側でできるようになっていました。で、
 小さいフォント=96dpi
 大きいフォント=120dpi
と設定されていたようです。Windows8.1では下記のような可変の設定画面になりました。


デフォルトのまま小さくするにしていますが、前述のLOGPIXELX/LOGPIXELYで出力された
結果は以前の「小さいフォント」の設定の時と同様、ともに96dpiでした。

で、前述の本には、HORZSIZEとVERTSIZEの値は、次式の計算結果であると書かれていま
した。

 水平サイズ=25.4×(水平解像度)/(水平方向dpi値)
 垂直サイズ=25.4×(垂直解像度)/(垂直方向dpi値)

25.4というのは、1インチ=25.4mmに基づく単位換算です。
ところが、プログラムランの結果、私のWindows8.1PCでは、

        上記計算値    表示サイズ
 水平サイズ   508        477 (HORZSIZE)
 垂直サイズ   279        268 (VERTSIZE)

となり、両者は不一致!!なんです(@_@;)

しかるに、HORZSIZE/VERTSIZEで表示された値から対角線長さを求めると

となりますので、私のモニターのサイズとずばり一致しているのです。
全くの驚きです。ひょっとして、固定?かもしれません。モニタと情報やりとりなどできると思
えませんし・・・。ネット調べたのですがよくわかりませんでした。Windows7では全然合わな
いと怒っている方がいましたけどね。これをプログラムで使っている方がおられるようで。

戻る