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) 을 하면 얻을 수 있다.
자세한 것은 아래 링크를 통해 확인