我想制作一个逐监视器dpi感知的Direct2D应用程序。我已经扩展了微软的"第一个Direct2D程序"的例子来处理WM_DPICHANGED
,正如Kenny Kerr在MSDN的文章中所解释的那样。当两个显示器都使用一个显卡时,它可以工作,但在使用我笔记本电脑的NVIDIA Optimus设置时,它会出现故障。
我可以通过以下步骤运行逐监视器感知WPF示例来重现相同的故障:
- 每个显示器的DPI缩放因子不同。
- Optimus启用(笔记本电脑显示集成图形,外部显示器Quadro卡)
- 应用程序在主显示器上启动-右边的外部监视器。
- 把它拖到左边,它可以正确处理DPI变化。
- 将其拖回右侧。当它处理DPI变化时,右侧显示器上的窗口部分变为黑色。左边的部分仍然画得很好。
(查看此bug的视频)
我只在上面的示例应用程序中看到过这个错误,当我试图将Kerr的WM_DPICHANGED处理器添加到一个更简单的示例中时。令人怀疑的是,我已经看到其他应用程序(Chrome, Visual Studio本身)显示类似的黑色窗口,但只是暂时的,如果我在显示器之间拖动并快速最大化它们。
有谁熟悉这个小故障吗?是我的显示驱动程序有问题吗?或者有其他应用程序做纠正它,这是示例代码没有?
你说NVIDIA Optimus ?那些司机都是有毛病的。尝试用D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS
标志初始化渲染目标。
这是我在2014年完成Paint时花了很长时间才弄清楚的事情。. NET 4.0,我仍然在代码中有一个注释警告我永远不要关闭它:
private PresentOptions hwndPresentOptions =
PresentOptions.Immediately |
PresentOptions.RetainContents; // If we don't use RetainContents, then we get awful
// black flickering and mouse trails on some hardware
// (e.g. NVIDIA Optimus)