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.

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top