2014-11-17 2 views
-1

У меня есть приложение с двумя классами, расширяющими 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); 

ответ

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 для копирования изображения.

Смежные вопросы