我通过C#中的pinvoke调用GetClientRect
来获取面板的尺寸(在WindowsForm上)我用作DirectX渲染目标区域。我会认为WinAPI给了我未缩放的(即返回的值应该是相同的,无论Windows显示DPI设置)维度,但它似乎给我缩放的一个(至少在Windows 8.1上,因为我没有测试它在其他操作系统上。)
ClientRectangle
属性也返回与GetClientRect
相同的缩放尺寸。我将表单AutoScaleMode
更改为none
时仍保持不变。
这是GetClientRect
的预期行为吗?如果是这样,我如何获得未缩放的尺寸?
编辑:这仅影响Windows 8.1。在Windows 7上测试它,GetClientRect返回未缩放的尺寸!
答案 0 :(得分:3)
P / Invoking GetClientRect
没有任何优势。通过查询ClientRectangle
属性,您可以得到完全相同的东西。
是的,其中任何一个都会在物理像素中返回客户区的大小,这显然不是你想要的。
您可能正在寻找ID2D1RenderTarget::GetSize
method,它会返回与设备无关的像素(DIP)中渲染目标的大小。
如果您必须转换物理像素(例如,来自鼠标事件),那么您可以使用ID2D1Factory::GetDesktopDpi
之类的内容来获取当前缩放因子,您可以使用这些因子将物理像素转换为DIP。
您在Windows 8.1中看到不同行为的原因可能是changes to the way it handles DPI scaling的结果。您可能会发现指示您的应用程序具有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 Studio中,右键单击项目,然后单击&#34;添加&#34; - &GT; &#34; New Item&#34;。选择&#34;应用程序清单文件&#34;并添加上面的代码。