GetClientRect返回缩放尺寸?

时间:2014-08-15 14:16:02

标签: c# winforms winapi pinvoke autoscalemode

我通过C#中的pinvoke调用GetClientRect来获取面板的尺寸(在WindowsForm上)我用作DirectX渲染目标区域。我会认为WinAPI给了我未缩放的(即返回的值应该是相同的,无论Windows显示DPI设置)维度,但它似乎给我缩放的一个(至少在Windows 8.1上,因为我没有测试它在其他操作系统上。)

ClientRectangle属性也返回与GetClientRect相同的缩放尺寸。我将表单AutoScaleMode更改为none时仍保持不变。

这是GetClientRect的预期行为吗?如果是这样,我如何获得未缩放的尺寸?

编辑:这仅影响Windows 8.1。在Windows 7上测试它,GetClientRect返回未缩放的尺寸!

1 个答案:

答案 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;并添加上面的代码。

相关阅读:Writing DPI-Aware Desktop and Win32 Applications