基本上,我有一个实现OpenGL的wxWidget应用程序 - 后者显示在面板上,可以通过用户输入(点击,拖动等),wxTimer或外部进程生成的事件进行更新。当焦点转移到另一个窗口时(无论是内部对话框还是其他应用程序),问题就出现了 - wxPanel在几秒钟后立即停止更新,特别是如果另一个窗口位于其上(有时,被遮挡的面板的一小部分仍将继续更新)。重新激活应用程序或调整窗口大小“解冻”面板,并继续正常操作。
这是我在wxWidgets中一直存在的一个问题,无论是在这种情况下使用OpenGL面板,还是其他方面。一般来说,我已经能够通过在窗口重新聚焦,窗口大小调整或类似kludgy的东西之间在Freeze()和Thaw()之间进行大量SwapBuffer()调用来绕过它,但这些都有可能产生闪烁或其他不可忽视的视觉瑕疵,并且如果每帧完成(例如动画需要在非活动窗口中继续播放时),还会影响性能。
不确定的反复试验期间可能会产生一些不错的东西,但是我真的很想知道,处理这个问题的“正确”方法是什么?非常感谢提前。
以下是参考代码的框架:
void MyGLCanvas::Draw(bool focus, int parentID) //This is what's called by the rest of the application
{
if (focus) { SetFocus(); }
SetCurrent();
wxClientDC dc(this);
Paint(dc);
}
void MyGLCanvas::Paint(wxDC &dc)
{
//All OpenGL drawing code here
glFlush();
SwapBuffers();
}
void MyGLCanvas::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
Paint(dc);
event.Skip();
}
答案 0 :(得分:0)
你在这里做了几件奇怪或彻头彻尾的错误:
OnPaint()
中的活动。这是Windows下wxWidgets 2.8中的一个致命错误,即使我们在你的代码后清理它,如果它在3.0中这样做,它仍然是一个坏主意。wxClientDC
,只需致电Refresh()
,让Windows通过调用您现有的OnPaint()
处理程序重新绘制窗口。SetFocus()
致电Draw()
,这真的不是必要的。SetCurrent()
。始终,而不仅仅是Draw()
。我不知道哪些会导致您遇到的问题,但您确实应该更改所有这些问题。有关如何正确执行此操作的示例,请参阅samples\opengl\cube\cube.cpp
。