usando wxWindows num GLUT / outra aplicação
-
13-09-2019 - |
Pergunta
Eu estou olhando basicamente para obter um nativo-like sistema GUI janela em meu OpenGL / jogo. Eu preciso para exibir uma única janela para o usuário.
Eu estou olhando para wxWidgets.
Porque ele funciona por "roubar" o WinMain / MainLoop, eu estou tentando cortá-lo para que eu possa executar o seu loop principal em um segmento separado.
Porque eu não poderia começar a sua wxThread funcionando bem, eu fiz uma "amostra" com o Windows Threads ... mas a inicialização ainda está quebrando nas wxWidgets internos ...
Qualquer feedback sobre isso?
Meu código é o seguinte:
class MyApp: public wxApp
{
virtual bool OnInit();
};
DECLARE_APP(MyApp)
IMPLEMENT_APP_NO_MAIN(MyApp)
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
wxApp* pApp = new MyApp();
wxApp::SetInstance(pApp);
int argc = 0; wxChar ** argv = NULL;
wxEntryStart(argc, argv);
pApp->CallOnInit();
pApp->OnRun();
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, wxCmdLineArgType lpCmdLine, int nCmdShow) {
DWORD id = 0;
CreateThread(NULL,0, MyThreadFunction,NULL, 0,&id);
assert(id != NULL);
return 0;
}
Eu tentei fazer os wxWidgets inicialização código no thread principal, e apenas chamar a CallOnInit () na thread separada, mas mesmo resultado.
Solução
O código acima deve funcionar, mas seria mais simples para wxEntry()
chamada apenas diretamente na sua função de thread. Você também pode preferir usar seu WinMain-como sobrecarga ou, pelo menos, fornecer válido argc
/ argv
(NULL
para o último poderia explicar o acidente).
Outras dicas
Cuidado: a maioria dos wxWidgets não é thread-safe! Você só deve fazer coisas GUI a partir de um único segmento. Este deve ser o fio que está sendo executado do Windows (ou qualquer outro) ciclo de eventos - que é o segmento principal (inicialização), ou esse, onde você chamar wxEntry. Eu consegui OpenGL renderização de um segmento separado trabalhando sob Windows - o wxGLCanvas precisa ser criado no segmento principal, necessidade de setCurrent chamada na renderização OpenGL fio, e você deve se certificar de que não tornem enquanto a janela está sendo redimensionado, etc ...
Você não tem que fazer nada especial para wx usar OpenGL, basta desenhar em um wx GLCanvas .