我试图在MSDN上找到答案,但我没有清楚地了解这是如何工作的。我的所有工作都在Windows 8.1上。
这是我的问题。我正在使用带有高分辨率显示器的笔记本电脑,3200x1800。我一直在使用EnumDisplayMonitors来获取屏幕的边界矩形。
如果我的显示设置是默认设置,这似乎工作正常。但是我注意到当我更改Window显示设置以提供更大的文本时,EnumDisplayMonitor返回的分辨率会发生变化。而不是获得3200x1800我将获得2133x1200。
我猜是因为我要求更大的文字,Windows选择将屏幕表示为较小的分辨率。
似乎如果我查看虚拟屏幕属性,所有内容都会在屏幕的实际坐标中显示,即3200x1800。但是用于获取窗口和监视器矩形的API似乎可以在这个"其他"坐标空间。
是否有任何文档/ Windows API来处理这些"其他坐标之间的转换"和#34;虚拟坐标"?即如果我想让EnumDisplayMonitor或GetMonitorInfo给我真正的屏幕坐标,我怎样才能将2133x1200转换为3200x1800?
答案 0 :(得分:4)
您已将视频适配器的DPI增加到150%(每英寸144点),以保持文本可读性并避免窗口大小与邮票大小相同。在如此高分辨率的显示器上非常必要。但是你没有告诉Windows你的程序知道如何处理它。
因此,它假设您的程序是一个从未设计为在此类监视器上运行的旧程序。它对你有帮助和谎言。它使程序将其输出呈现到内存缓冲区,然后获取该输出,将其重新缩放150%并将其复制到视频适配器。这是你可以看到的,如果你把你的程序的输出放在一个不要求这种缩放的程序旁边,比如记事本,文本看起来会更模糊。
当然,当你要求屏幕大小时,它就在于你。它告诉你它比实际小150%。因此,重新缩放后,您创建的窗口将填满屏幕。
这一切都很好但当然不理想,你的程序看起来不那么好。 {em>你知道如何处理更高分辨率的You have to tell Windows。请注意,这看起来比在实践中更容易。让文本看起来清晰是微不足道的,这是有问题的位图。总的来说,这是一个肥沃的虫子来源,甚至是big companies can get this wrong。
答案 1 :(得分:0)
在开始回答之前,让我问一下:你真正想做什么?或者更具体 - 为什么你需要知道显示器分辨率?执行此操作的标准方法是调用GetWindowRect(GetDesktopWindow(), &rect)
我不确定屏幕坐标是否根据DPI设置更改 - 但您应该尝试使用而不是GetMonitorInfo,因为后者适用于更高级的内容。如果GetWindowRect仍然返回缩放的矩形,请根据需要调用DPtoLP,LPtoDP或other mapping coordinate function。
如上所述调整显示设置时,实际上是在更改屏幕的DPI设置。因此,某些API进入兼容模式,以便它们允许应用程序创建更大的元素和窗口,而无需了解此设置。
为什么您需要知道实际的屏幕分辨率,因为大多数窗口API在DPI缩放变化时会相应地运行?
我怀疑你可以调用SetProcessDPIAware或清单文件等效。但请先阅读this MSDN article以了解DPI缩放。