我basicly希望得到一个类似天然的窗口GUI系统进入我的OpenGL /游戏。我需要显示一个窗口提供给用户。

我寻找到的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()在单独的线程,但同样的结果。

有帮助吗?

解决方案

在上面的代码应该工作,但它会更简单,只是直接在你的线程函数中调用wxEntry()。您可能还希望使用其的WinMain状过载或至少提供有效argc / argvNULL后者可能解释崩溃)。

其他提示

请注意:大多数的wxWidgets不是线程安全的!您应该只从单个线程做GUI的东西。这应该是正在运行在Windows(或其他)事件循环线程 - 这是最主要的(启动)线,或者一个,在那里你打电话wxEntry。 我设法得到的OpenGL从一个单独的线程渲染在Windows下工作 - 在wxGLCanvas需要在主线程上创建的,需要调用的setCurrent在OpenGL的渲染线程,你必须确保你不渲染,而窗口是调整大小,等等...

您不必做什么特别的宽x使用OpenGL,仅仅指刚伊特诺画 wxGLCanvas

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top