多个wxGLCanvas与OpenGL-wxPaintDC绘图组合

时间:2014-11-17 14:08:04

标签: c++ opengl windows-7 wxwidgets

我有一个应用程序,有两个类扩展wxGLCanvas,另一个扩展wxWindow。它们实现了用户对象的3种可能的可视化。其中只有一个同时显示。两个wxGLCanvas包含一个OpenGL场景和一些使用wxPaintDC叠加的文本的组合。 wxWindow使用wxBufferedPaintDC绘制所有内容。

问题1:在某些机器中,当从一个wxGLCanvas交换到另一个机器时,在第一次渲染场景时,会显示一个背景图像,直到出现第一个渲染图像。我发现这个背景图片来自wxGLCanvas背景。

问题2:在出现问题1的相同机器中,当使用函数wxClientDC.Blit时,不是采用叠加文本的OpenGL场景,而是使用叠加文本获取wxGLCanvas背景图像(与问题1相同) ;所以它采用不包含OpenGL场景的画布上下文。在其他机器中,屏幕截图的结果是正确的。

信息:当我选择wxWindow视图时,使用wxBufferedPaintDC绘制所有视图,问题1和2的背景图像将更新为wxWindow显示的帧。如果我现在在wxGLCanvases之间切换,我会看到" flash" wxWindow视图。

截取代码(内部类扩展wxGLCanvas):

wxClientDC lv_contexteVue(this);
int lv_largeurVue;
int lv_hauteurVue;

lv_contexteVue.GetSize(&lv_largeurVue,&lv_hauteurVue);

wxBitmap lv_vue(lv_largeurVue,lv_hauteurVue);

wxMemoryDC lv_contexteAux;

lv_contexteAux.SelectObject(lv_vue);
lv_contexteAux.Blit(0,0,lv_largeurVue,lv_hauteurVue,&lv_contexteVue,0,0);

lv_vue.SaveFile(wxString(er_cheminSauvegarde.c_str(),wxConvLibc,er_cheminSauvegarde.size()),wxBITMAP_TYPE_BMP);

lv_contexteAux.SelectObject(wxNullBitmap);

代码显示场景OpenGL后跟覆盖文本(Inside class extends wxGLCanvas):

wxPaintDC dc(this);
//dc.Clear();
dc.SetBackground(*wxBLACK);
dc.SetBackgroundMode(wxSOLID);
dc.SetTextBackground(*wxBLACK);
dc.SetTextForeground(*wxWHITE);

SetCurrent(mv_contexte);

if (!mv_estInitialise)
{
    initialiser();
    mv_estInitialise = true;
}

Evenement lv_demandeDessin(DEMANDE_AFFICHAGE_2DPLUS);
mp_controleur->traiterEvenement(lv_demandeDessin);

SwapBuffers();


//dc.ClearCache();
wxColour lv_couleurEspaceLibre = *wxWHITE;
dc.SetBrush(wxBrush(lv_couleurEspaceLibre));
dc.SetPen(wxPen(lv_couleurEspaceLibre, 1));
//Overlay Text 
wxSize screenSize = this->GetSize();
//dc.SetTextForeground(wxColour(240, 240, 240, 255));
wxFont font(8, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false);
dc.SetFont(font);
//dc.SetTextBackground(wxColour(0, 0, 0, 200));
string formated = ConstantesATLAS::FILIGRANE_PRE+Constantes::VERSION+Constantes::FILIGRANE_POS;
wxString mystring = wxString::FromAscii(formated.c_str());
//dc.DrawText(mystring,5,screenSize.GetY()-20);
dc.DrawText(mystring,5,5);

1 个答案:

答案 0 :(得分:0)

从wxWidgets论坛回答这里发布的同一个问题,所有这些都归功于他们:)

https://forums.wxwidgets.org/viewtopic.php?f=1&t=40288&e=0

总结:不要混用OpenGL和wxPaintDC。要获取带有重叠文本的openGL的屏幕截图,有两个很好的可能性:

1 - 将叠加的文本与OpenGL放在一起,例如叠加的正投影。然后使用glReadPixels()函数截取屏幕截图。

2 - 如果使用DC覆盖文本,要截取屏幕截图,首先要求OpenGL返回数组中的所有视口。将此数组转换为wxImage,以与重绘事件中叠加的方式相同的方式重新设置图像中的文本,使用dc.Blit函数复制图像。