У меня есть приложение с двумя классами, расширяющими wxGLCanvas и один расширяющий wxWindow. Они реализуют 3 типа возможной визуализации объектов пользователя. Одновременно отображается только один из них. Два wxGLCanvas содержат комбинацию сцены OpenGL плюс некоторый текст, наложенный с использованием wxPaintDC. WxWindow рисует все, используя wxBufferedPaintDC.Несколько wxGLCanvas с комбинацией чертежей OpenGL-wxPaintDC
Проблема 1. На некоторых машинах при обмене с одного wxGLCanvas на другой, во время первого рендеринга сцены фоновое изображение отображается только до появления первого визуализированного изображения. Это фоновое изображение я узнал, что происходит из фона wxGLCanvas.
Проблема 2: на тех же машинах, где появляется проблема 1, при использовании функции wxClientDC.Blit вместо того, чтобы снимать сцену OpenGL с наложенным текстом, она принимает фоновое изображение wxGLCanvas (то же, что и проблема 1) с наложенным текст; поэтому он принимает контекст canvas, исключая сцену OpenGL. В других машинах результат скриншота правильный.
INFO: Когда я выбираю вид wxWindow, где все рисуется с использованием wxBufferedPaintDC, фоновое изображение обеих проблем 1 и 2 обновляется до кадра, отображаемого wxWindow. Если я сейчас переключаюсь между wxGLCanvases, я увижу «вспышку» вида 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, за которой следует накладываемому текст (внутри класса, простирающейся 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);