当窗口处于非活动状态时,wxPanel闪烁/失败

时间:2013-12-12 03:24:12

标签: wxwidgets

基本上,我有一个实现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();
}

1 个答案:

答案 0 :(得分:0)

你在这里做了几件奇怪或彻头彻尾的错误:

  1. 跳过OnPaint()中的活动。这是Windows下wxWidgets 2.8中的一个致命错误,即使我们在你的代码后清理它,如果它在3.0中这样做,它仍然是一个坏主意。
  2. 请勿使用wxClientDC,只需致电Refresh(),让Windows通过调用您现有的OnPaint()处理程序重新绘制窗口。
  3. 请勿从SetFocus()致电Draw(),这真的不是必要的。
  4. 在绘图前请致电SetCurrent()。始终,而不仅仅是Draw()
  5. 我不知道哪些会导致您遇到的问题,但您确实应该更改所有这些问题。有关如何正确执行此操作的示例,请参阅samples\opengl\cube\cube.cpp