【发布时间】:2023-03-04 05:26:01
【问题描述】:
我有一个现有的 MFC 应用程序,它在 Windows 7 的默认 DPI (96 dpi) 下运行良好。但是当我将 DPI 增加 150% 时,UI 会失真。我已经修复了在特定级别使用滚动条的问题,并参考了 msdn 文章。我想知道如何使用 MFC 代码获取系统的当前 DPI,以便设置对话框的高度和宽度。
请推荐!!
【问题讨论】:
标签: visual-c++ mfc
我有一个现有的 MFC 应用程序,它在 Windows 7 的默认 DPI (96 dpi) 下运行良好。但是当我将 DPI 增加 150% 时,UI 会失真。我已经修复了在特定级别使用滚动条的问题,并参考了 msdn 文章。我想知道如何使用 MFC 代码获取系统的当前 DPI,以便设置对话框的高度和宽度。
请推荐!!
【问题讨论】:
标签: visual-c++ mfc
首先,您需要获取屏幕的设备上下文。这很简单,只需调用 GetDC,如下所示:
HDC screen = GetDC(0);
然后您询问该设备上下文的设备功能。在您的情况下,您需要每英寸沿 X 轴和 Y 轴的像素:
int dpiX = GetDeviceCaps (screen, LOGPIXELSX);
int dpiY = GetDeviceCaps (screen, LOGPIXELSY);
(有关 GetDeviceCaps 的更多信息,请参阅 http://msdn.microsoft.com/en-us/library/dd144877(v=vs.85).aspx)。
最后,再次释放设备上下文:
ReleaseDC (0, screen);
【讨论】:
根据 Patrick 的回答,您可能还想阅读这篇关于编写高 DPI 感知用户界面的 Microsoft 教程:
【讨论】:
下面的代码 sn-p 在 Win7 中给了我正确的 DPI
ID2D1Factory* m_pDirect2dFactory;
D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pDirect2dFactory);
FLOAT dpiX, dpiY;
m_pDirect2dFactory->GetDesktopDpi( &dpiX, &dpiY );
【讨论】:
GetDeviceCaps 完全相同,但仅限Win7+。