VC モニターの物理サイズ(インチ)の取得方法
はじめに
VCで、「モニターが物理的に何インチなのか?」を取得する方法を書きます。
一発でとれるわけではなく、計算をしないといけないのですが、
GetDeviceCaps()を使用するので、対象OSがWindows 2000まで広がります。
Windows 7がサポート切れるこのご時世にそこまでカバーしなくてもとも思うけど、
余計な実装や依存関係を考えなくていいのがうれしいですね。
ちなみに、アイキャッチはDCを取得したりするので、
いらすとやさんからワシントンDCの画像を…
モニターサイズの計算
今回は、GetDeviceCaps()を使用して、物理スクリーンの幅と高さ(ミリメートル)を取得して計算します。
取得できるのがミリメートルなので、インチに単位変換が必要になります。
1in = 25.4mm
モニターサイズを算出する式です。
モニターサイズ(in) = sqrt(幅 * 幅 + 高さ * 高さ) / 25.4(mm)
その他
DCが必要となるので、GetDC(NULL)で画面全体を取得します。
あと、取得したDCはリリースが必要なので使用後は、ReleaseDC()をする。
GetDeviceCaps()のindexには、
HORZSIZE : Width, in millimeters, of the physical screen. (幅)
VERTSIZE : Height, in millimeters, of the physical screen. (高さ)
を指定する。
ソース
簡単にコンソールアプリのコードを作成しました。
#include <iostream>
#include <windows.h>
int main()
{
HDC hdc = GetDC(NULL);
int iHORZSIZE = GetDeviceCaps(hdc, HORZSIZE);
int iVERTSIZE = GetDeviceCaps(hdc, VERTSIZE);
ReleaseDC(NULL, hdc);
std::cout <<
" HORZSIZE:" << iHORZSIZE << "mm" << std::endl <<
" VERTSIZE:" << iVERTSIZE << "mm" << std::endl <<
" inch:" << sqrt(iHORZSIZE * iHORZSIZE + iVERTSIZE * iVERTSIZE) / 25.4 << "in" << std::endl <<
"";
return 0;
}
ここから下はおまけ
解像度とDPIの取得
当初、インチ計算のために、解像度とDPIを取得して計算しようとしていました。
しかし、どうしてもDPIが決め打ちしか返さないので諦めました。
WindowsではDPIは互換性のために96を必ず返すそうです。
拡大縮小やカスタムスケーリングを行っていると、96に倍率をかけた数字が返ってきました。
Awareを設定する方法も試したんですけどだめでした。
関係ないけどGetWindowRect()で解像度を取得したりもしたので、
一応、サンプルコードものせときます。
色んな環境で試すと面白いですよ!!
#include <iostream>
#include <windows.h>
int main()
{
SetProcessDPIAware();
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);
std::cout <<
" left:" << rc.left << std::endl <<
" top:" << rc.top << std::endl <<
" right:" << rc.right << std::endl <<
" bottom:" << rc.bottom << std::endl <<
"";
HDC hdc = GetDC(NULL);
int iHORZRES = GetDeviceCaps(hdc, HORZRES);
int iVERTRES = GetDeviceCaps(hdc, VERTRES);
int iLOGPIXELSX = GetDeviceCaps(hdc, LOGPIXELSX);
int iLOGPIXELSY = GetDeviceCaps(hdc, LOGPIXELSY);
int iHORZSIZE = GetDeviceCaps(hdc, HORZSIZE);
int iVERTSIZE = GetDeviceCaps(hdc, VERTSIZE);
ReleaseDC(NULL, hdc);
std::cout <<
" HORZRES:" << iHORZRES << std::endl <<
" VERTRES:" << iVERTRES << std::endl <<
" LOGPIXELSX:" << iLOGPIXELSX << std::endl <<
" LOGPIXELSY:" << iLOGPIXELSY << std::endl <<
"";
std::cout <<
"inch:" << sqrt(iHORZRES * iHORZRES + iVERTRES * iVERTRES) / iLOGPIXELSX << std::endl <<
"";
std::cout <<
" HORZSIZE:" << iHORZSIZE << std::endl <<
" VERTSIZE:" << iVERTSIZE << std::endl <<
" inch:" << sqrt(iHORZSIZE * iHORZSIZE + iVERTSIZE * iVERTSIZE) / 25.4 << std::endl <<
"";
int i;
std::cin >> i;
return 0;
}