【问题标题】:Rendering issue in WPF window while dragging拖动时WPF窗口中的渲染问题
【发布时间】:2013-12-26 17:03:48
【问题描述】:

我有我的 Direct3D 引擎渲染的 WPF 窗口。 WPF 窗口 我从我在 C++/CLI 上开发的引擎开始。 我有 2 个显示器,当我在它们之间移动窗口时,窗口的一部分变成白色并且不会更新,直到我不停止拖动它(如屏幕截图)。 有人知道如何解决这个问题吗?

由于代码很多,这里很难发布代码,但我会尝试:

我在一个项目中使用托管 C++ 和非托管 C++: 因此,我添加了 .Net dll 以访问 WPF 窗口:

Window^ wnd = gcnew Window();
wnd->Width = 1280;
wnd->Height = 720;
wnd->Show();
WindowInteropHelper^ helper = gcnew WindowInteropHelper(wnd);
HWND WPFHwnd = (HWND)helper->Handle.ToPointer();
HINSTANCE hinstance = (HINSTANCE)Marshal::GetHINSTANCE(this->GetType()->Module).ToPointer();
engine->SetHisnstanceHWND(WPFHwnd, hinstance);

engine->InitializeSystem(wnd->ActualWidth, wnd->ActualHeight);

engine - 这是一个非托管类,它封装了所有渲染工作。 此外,它是一个标准的 d3d 渲染循环。没什么特别的。 它渲染正常,但是当我调整窗口大小或移动窗口时,它会像这样绘制它的一部分(白色)。当我停止调整大小或移动时 - 一切正常。

我的问题是:是否有可能摆脱这种影响?

更新:

如果 WPF 窗口,我挂钩了 wndProc,并在大小更改时尝试使用 UpdateLayout(),但这没有效果。似乎窗口对任何干预都没有反应。

【问题讨论】:

  • 发布一些相关代码,看看您是否在小型测试项目中重现错误。您的项目结构似乎并不清晰:您的 D3D 引擎渲染器是什么? WPF 与此有何关系,等等。

标签: wpf


【解决方案1】:

嗯,听起来您的引擎正在接收 WM_ERASEBKGND 并且它清除了窗口。释放窗口后,它会发送 WM_PAINT 并且一切都再次清晰。这就是我认为可能会发生的事情。

为了测试这个理论,您可以处理该消息并返回 true。把它放到你的引擎消息处理例程中:

case WM_ERASEBKGND:
{
  PAINTSTRUCT pss;
  BeginPaint(hWnd,&pss);
  EndPaint(hWnd,&pss);

  return true;
}

您可以使用 WinSpy++ 检查哪些消息被传递到窗口下方。如果您想查看背景变白的原因,您可以通过 ProcessMonitor 执行此操作,并查看正在发出哪些 API 调用。您可能对包含白色的 API 调用感兴趣。

【讨论】:

  • 我测试了它,可以说它有效,但只有一半。现在当窗口退出或显示时它不会变成白色,但是当我改变它的大小时,整个窗口在改变它的大小期间仍然变成白色。在这种情况下我能做什么?请帮我解决这个问题。
  • 你找到清空你窗口的“源头”了吗?使用 WinSpy 并查找在调整大小时生成的所有消息并分析它们。您也应该发布您的 D3D 引擎循环。你如何处理 D3D 中的调整大小?注意我对 D3D 不太熟悉,但是将 OPENL 集成到 WPF 中是类似的。您应该订阅 WPF 的 SizeChanged 事件,并可能在您的 HWND 上触发 WM_PAINT?不确定。
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多