2009-06-13 9 views
0

我基本上希望在我的OpenGL/Game中獲得一個類似本地的窗口GUI系統。我需要向用戶顯示一個窗口。在GLUT /其他應用程序中使用wxWidgets

我正在調查wxWidgets。

因爲它通過「竊取」WinMain/MainLoop工作,我試圖破解它,所以我可以在一個單獨的線程上運行它的主循環。

因爲我無法得到它的wxThread運作良好,我做了一個「樣本」與Windows線程...但初始化是在wxWidgets的內部還是破...

任何反饋這?

我的代碼是這樣的:

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; 
} 

我試着做在主線程wxWidgets的初始化代碼,並且只在單獨的線程調用CallOnInit(),但同樣的結果。

+0

爲什麼你需要在主線程的wxWidgets框架之外工作?只是好奇心,因爲我也使用wxWidgets/OpenGL的遊戲,只是使用閒置功能爲我的「主」。 – 2009-06-13 01:47:08

回答

0

上面的代碼應該可以工作,但直接在線程函數中調用wxEntry()會更簡單。您也可能更喜歡使用其類似WinMain的過載,或者至少爲後者提供有效的argc/argvNULL可能會解釋崩潰)。

0

你不需要做任何特殊的事情來讓wx使用opengl,只需要畫一個wxGLCanvas即可。

1

注意:wxWidgets絕大部分不是線程安全的!你應該只從一個線程做GUI的東西。這應該是運行Windows(或其他)事件循環的線程 - 這是主要(啓動)線程,或者是您調用wxEntry的那個線程。 我設法從在Windows下工作的單獨線程獲取OpenGL渲染 - 需要在主線程上創建wxGLCanvas,需要在OpenGL渲染線程中調用SetCurrent,並且您必須確保在窗口正在調整大小等...

相關問題