关于DPI问题

时间:2009-02-21 04:21:47

标签: windows winapi dpi

我有一个WIN32 SW,其UI设计为96 DPI,因此当用户将Windows DPI从96更改为120或更大时,UI将是错误的。我想知道是否有API强制我的SW显示96DPI的UI。

3 个答案:

答案 0 :(得分:2)

从Windows Vista开始,DPI的缩放应该会自动发生。我没有任何直接经验知道它的工作原理,但这里是解释如何关闭它的页面:

http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx

答案 1 :(得分:2)

您还可以为应用程序添加appcompat密钥。在注册表中的位置是:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

这是每用户设置,HKEY_LOCAL_MACHINE中有相同的密钥,但当然这是一个系统设置,需要提升权限才能写入。像这样添加一个键:

"C:\path\to\app.exe"="HIGHDPIAWARE"

将为您的程序启用该兼容性标志,这将关闭DPI缩放。这适用于Vista +。

根据文件,

SetProcessDPIAware也是一种选择,但请注意存在竞争条件的危险。

答案 2 :(得分:1)

没有API强制您的应用以96DPI显示。 DPI是设备设置,无法按应用程序进行控制。

如果您可以更改程序,则可以扩展UI以在高DPI上正确查看。你需要致电GetDeviceCaps;更具体地说,您需要使用LOGPIXELSXLOGPIXELSY返回的数字来计算X和Y比例。像这样:

HDC hdc;
double m_dDPIScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0;
double m_dDPIScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0;