我的应用程序有一个要绘制的交换链,可以直接绘制到
HWND
,或者在 WinUI3 版本中绘制到 SwapChainPanel
。
当应用程序清单中缺少 DPI 感知设置时,一切都很好:
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
我的 DPI 始终为 96,Windows 会适当缩放。
当我的应用程序具有 DPI 感知功能,并将其放在缩放比例为 150%、DPI 为 144 的 4K 屏幕上时,我的应用程序的普通 Win32 版本可以正确运行。我得到 4K 的
GetClientRect
,我的 Direct2D SwapChain
尺寸也是 3840x2160。
当我使用
SwapChainPanel
运行 WinUI 版本时,会看到奇怪的事情。我仍然得到 3840x2160 的 Direct2D SwapChain
,但 SwapChainPanel
调整大小超出屏幕,因此看不到内容的最右侧和最底部。 Direct2D 代码看到 3840x2160 的正常矩形,但未显示绘制到该矩形的底部区域。
如果我将 DPI Awarename 设置为
"PerMonitor"
而不是 "PerMonitorV2"
,则它可以正常工作。
我错过了什么吗?
您可以参考该主题:https://github.com/microsoft/microsoft-ui-xaml/issues/8219
根据文档:SwapChainPanel 类
为了保持清晰的矢量渲染,您应该监听 CompositionScaleChanged 事件并查询 CompositionScaleX 和 CompositionScaleY 属性值用于说明当前 UI 比例, 并可能从 DirectX 再次渲染。否则 XAML 布局可能会 进行缩放,您的视觉效果可能会降低。
这是目前的设计。