سؤال

أنا أتطلع أساسا للحصول على نظام واجهة المستخدم الرسومية من النافذة الأصلية في بلدي OpenGL / Game. أحتاج إلى عرض نافذة واحدة للمستخدم.

أنا أبحث في wxwidgets.

نظرا لأنها تعمل عن طريق "سرقة" WinMain / Mainloop، أحاول اختراقها حتى أتمكن من تشغيل حلقة رئيسية لها على موضوع منفصل.

لأنني لم أستطع أن أحصل على عملها جيدا، فقد قمت ب "عينة" مع خيوط Windows ... ولكن التهيئة لا تزال تحطمت على WxWidgets Internals ...

أي ردود فعل على هذا؟

الرمز الخاص بي هو:

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/argv (NULL لهذا الأخير قد يفسر الحادث).

نصائح أخرى

حذار: معظم WxWidgets ليس آمنا موضوع! يجب عليك فقط القيام بأشياء واجهة المستخدم الرسومية من مؤشر ترابط واحد. يجب أن يكون هذا هو الخيط الذي يقوم بتشغيل حلقة الحدث (أو أيا كان) - هذا هو الخيط الرئيسي (بدء التشغيل)، أو واحد، حيث تسمون Wxentry. تمكنت من الحصول على عرض OpenGL من مؤشر ترابط منفصل يعمل تحت Windows - يجب إنشاء WxGlCanvas على الخيط الرئيسي، تحتاج إلى استدعاء SetCurrent في مؤشر ترابط OpenGL Render، ويجب عليك التأكد من أنك لا تجعل النافذة هي تغيير حجم، الخ ...

ليس عليك القيام بأي شيء خاص ل WX لاستخدام OpenGL، JSUT رسم ITNO wxglcanvas..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top