본문 바로가기

개발관련/MFC

윈도우 해상도, DIP, DPI?

윈도우 해상도를 얻을 때
GetSystemMetrics(SM_CXSCREEN); // width
GetSystemMetrics(SM_CYSCREEN); // height
함수를 사용한다.

그런데 최근 일부 노트북에서 비정상적인 동작들이 발생해서 찾던 중...!!!

위 함수가 이상한 값을 리턴하는 것을 알게 되었다.

'Device Independent Pixels(DIP)' 때문이었던 것이다.

이것 때문에 항상 동일하게 동작하기 위해서는 Dpi 를 구하고 scaling factor 를 적용해서 구현
해야 했다.

구하는 방법은 여러가지가 있는데 
2번은... vs2008에서는 지원이 안되는 건지, 라이브러리가 없어서 그런건지... ::GetDpiForMonitor 함수 사용이 안된다.. 어쩔수 없이 1번을..

    /* 1. DC를 얻어와서 구하는 방법 */
    HDC hdc = GetDC(NULL);
	if ( hdc )
	{
		xDpi = GetDeviceCaps(hdc, LOGPIXELSX);
		yDpi = GetDeviceCaps(hdc, LOGPIXELSY);
		ReleaseDC(NULL, hdc);
	}

    /* 2. Monitor 정보를 얻어와서 구하는 방법 */
    HWND hDesktopWnd = ::GetDesktopWindow();
	HMONITOR hMonitor = ::MonitorFromWindow(hDesktopWnd, MONITOR_DEFAULTTOPRIMARY);
	::GetDpiForMonitor(hMonitor, MDT_EFFECTIVE_DPI, &nDpiX, &nDpiY);

X, Y 를 서로 다른 dpi를 사용하는 경우도 있는지는 모르지만 각각 구해서 적용.

DIPs = pixels / (DPI/96.0) 을 하면 얻을 수 있다.


자세한 것은 아래 링크를 통해 확인

"Writing DPI-Aware Desktop and Win32 Applications"

"DPI and Device-Independent Pixels"