我通过C#中的pinvoke调用C#来获取面板的维度(在WindowsForm上),作为DirectX呈现目标区域。我认为WinAPI给了我不缩放的维度(即无论设置如何,返回的值都应该是相同的),但是它似乎给了我缩放的维度(至少在Windows8.1上,因为我还没有在其他OSes上测试它)。
ClientRectangle属性还返回与GetClientRect相同的缩放维度。当我将表单AutoScaleMode更改为none时,情况仍然一样。
这是GetClientRect的预期行为吗?如果是这样的话,我如何得到无标度的尺寸?
编辑:这只会影响Windows8.1。在Windows7上进行测试,GetClientRect将返回未缩放的维度!
发布于 2014-08-15 16:15:12
P/调用GetClientRect没有任何好处。通过查询ClientRectangle属性可以得到完全相同的结果。
是的,其中任何一个都将返回客户区域的大小(以物理像素为单位),这显然不是您想要的。
您可能在寻找方法,它以独立于设备的像素(DIPs)返回呈现目标的大小。
如果您必须转换物理像素(例如,从鼠标事件),那么您可以使用类似于ID2D1Factory::GetDesktopDpi的东西来获取当前的缩放因子,您可以使用这些因子将物理像素转换为DIPs。
您在Windows8.1中看到不同行为的原因可能是改变它处理DPI缩放的方式的结果。您可能会发现,指出您的应用程序是新闻部感知是一个更容易的解决方案比模糊以上。这将阻止UI自动缩放以匹配当前DPI设置。通过将以下内容添加到应用程序的清单中,可以做到这一点:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>在Visual中,右键单击项目并单击"Add“-> "New Item”。选择“应用程序报表文件”并添加上述代码。
相关阅读:编写新闻部感知的桌面和Win32应用程序
https://stackoverflow.com/questions/25328065
复制相似问题