拖动时在WPF窗口中呈现问题

时间:2013-12-25 09:57:38

标签: wpf

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

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

我在一个项目中使用托管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);

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

我的问题是:是否可以摆脱这种效果?

更新

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  return true;
}

您可以使用WinSpy ++查看传递到窗口下方的消息。如果您想了解为什么背景被删除,您可以通过ProcessMonitor完成,并查看正在发出的API调用。您可能对包含白色的API调用感兴趣。