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;
}

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です