6

我想做一个 Per-Monitor DPI-Aware Direct2D 应用程序。我已经扩展了 Microsoft 的“第一个 Direct2D 程序”示例以按照Kenny Kerr 的 MSDN 文章WM_DPICHANGED中的说明进行处理。这在两台显示器都使用一个视频卡时有效,但在使用我的笔记本电脑的 NVIDIA Optimus 设置时会出现故障。

我可以通过以下步骤运行Per-Monitor Aware WPF 示例来重现相同的故障:

  • 每个显示器上的不同 DPI 比例因子。
  • 启用 Optimus(集成显卡上的笔记本电脑显示器,Quadro 卡上的外接显示器)
  • 该应用程序在主显示器上启动 - 右侧的外接显示器。
  • 将其拖到左侧,它会正确处理 DPI 更改。
  • 将其拖回右侧。当它处理 DPI 更改时,右侧监视器上的窗口部分变为黑色。左侧的部分仍然正确绘制。

(请参阅此错误的视频

我只在上面的示例应用程序中看到了这个错误,当我尝试将 Kerr 的 WM_DPICHANGED 处理程序添加到一个更简单的示例时。可疑的是,我已经看到其他应用程序(Chrome、Visual Studio 本身)显示类似的黑色窗口,但只是暂时的,如果我在监视器之间拖动并快速最大化它们。

那么 - 有人熟悉这个故障吗?这是我的显示驱动程序中的一些错误吗?或者是否有其他应用程序可以纠正它,而示例代码没有?

4

1 回答 1

3

你说英伟达擎天柱?那些司机是有罪的。尝试使用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)
于 2016-07-10T18:51:16.717 回答