123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #include "main.h"
- #include "dpi.h"
- // DPI awareness based on http://msdn.microsoft.com/en-US/library/dd464660.aspx
- // Definition: relative pixel = 1 pixel at 96 DPI and scaled based on actual DPI.
- BOOL _fInitialized = FALSE;
- int _dpiX = 96, _dpiY = 96;
- void _Init()
- {
- if (!_fInitialized)
- {
- HDC hdc = GetDC(NULL);
- if (hdc)
- {
- _dpiX = GetDeviceCaps(hdc, LOGPIXELSX);
- _dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
- ReleaseDC(NULL, hdc);
- }
- _fInitialized = TRUE;
- }
- }
- // Get screen DPI.
- int GetDPIX()
- {
- _Init();
- return _dpiX;
- }
- int GetDPIY()
- {
- _Init();
- return _dpiY;
- }
- // Convert between raw pixels and relative pixels.
- int ScaleX(int x)
- {
- _Init();
- return MulDiv(x, _dpiX, 96);
- }
- int ScaleY(int y)
- {
- _Init();
- return MulDiv(y, _dpiY, 96);
- }
- int UnscaleX(int x)
- {
- _Init();
- return MulDiv(x, 96, _dpiX);
- }
- int UnscaleY(int y)
- {
- _Init();
- return MulDiv(y, 96, _dpiY);
- }
- int _ScaledSystemMetricX(int nIndex)
- {
- _Init();
- return MulDiv(GetSystemMetrics(nIndex), 96, _dpiX);
- }
- int _ScaledSystemMetricY(int nIndex)
- {
- _Init();
- return MulDiv(GetSystemMetrics(nIndex), 96, _dpiY);
- }
- // Determine the screen dimensions in relative pixels.
- int ScaledScreenWidth()
- {
- return _ScaledSystemMetricX(SM_CXSCREEN);
- }
- int ScaledScreenHeight()
- {
- return _ScaledSystemMetricY(SM_CYSCREEN);
- }
- // Scale rectangle from raw pixels to relative pixels.
- void ScaleRect(__inout RECT *pRect)
- {
- pRect->left = ScaleX(pRect->left);
- pRect->right = ScaleX(pRect->right);
- pRect->top = ScaleY(pRect->top);
- pRect->bottom = ScaleY(pRect->bottom);
- }
- // Determine if screen resolution meets minimum requirements in relative pixels.
- BOOL IsResolutionAtLeast(int cxMin, int cyMin)
- {
- return (ScaledScreenWidth() >= cxMin) && (ScaledScreenHeight() >= cyMin);
- }
- // Convert a point size (1/72 of an inch) to raw pixels.
- int PointsToPixels(int pt)
- {
- _Init();
- return MulDiv(pt, _dpiY, 72);
- }
|