SDL2 / wxWidgets SDL_CreateWindowFrom

时间:2016-05-07 16:41:30

标签: c++ linux wxwidgets sdl-2

我花了最近几天试图将SDL2显示器嵌入到wxWidgets中但却失败了。好的,这就是我到目前为止......

首先是一个小细节:

  • wxWidgets版本:3.1 | SDL版本2.0.4 |操作系统:Fedora 23 | g ++ 5.3.1

我搜索了Google但找不到更多最新信息。我发现我建议我应该使用SDL_CreateWindowFrom()然后将其链接到wxPanel或wxStaticBitmap。

我编写的测试代码实现了一个简单的wxFrame并初始化了SDL2,代码编译得很好但是在运行时挂起。我是SDL2的新手,所以如果有人看看我的代码并看看我是什么,我将不胜感激做错了。我显然在这里误解了一些东西,所以任何帮助都会受到赞赏。

以下代码是一个简化的框,它突出了我的问题。

main.h

#include <wx/wx.h>
#include <SDL2/SDL.h>

class TestApp : public wxApp
{
public:
    virtual bool OnInit();
};

的main.cpp

 wxIMPLEMENT_APP_NO_MAIN(TestApp);

// Initialise SDL before WX-Widgets and GTK3

int main(int argc, char** argv)
{
    // Initialise SDL and Error Check
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cerr << "SDL Initialisation Error\n\n";
    }

    return wxEntry(argc, argv);
}

// WX-WIDGETS ENTRY POINT: Handover control to WX-Widgets

bool TestApp::OnInit()
{
    UI_Frame *frame = new UI_Frame("SDL Playing with wxWidgets");
    frame->Show(true);
    return true;
}

TestApp.h

class UI_Frame : public wxFrame
{
public:
    UI_Frame(const wxString& title);

private:

    wxDECLARE_EVENT_TABLE();
};

最后,处理SDL和wxFrame的方法

TestApp.cpp

wxBEGIN_EVENT_TABLE(UI_Frame, wxFrame)

wxEND_EVENT_TABLE()


UI_Frame::UI_Frame(const wxString& title) : wxFrame(NULL, wxID_ANY, title)
{

    this->SetSize(1024, 768);

    wxBoxSizer* topSizer;

    topSizer = new wxBoxSizer(wxVERTICAL);

    wxPanel *panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
    topSizer->Add(panel, 1, wxEXPAND | wxALL, 5);


    /*******************************************************
     *
     * SDL Specific Stuff
     *
     ******************************************************/

    SDL_Window *sdl_window = nullptr;
    SDL_Renderer *renderer = nullptr;

    // SDL: Create Embedded Window in wxWidgets
    sdl_window = SDL_CreateWindowFrom((void *) panel->GetHandle());


    if (sdl_window == NULL) {
        std::cerr << "SDL NULL Pointer ERROR";
        return;
    }


    // *** This line causes the application to hang ***
    renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_ACCELERATED);

    if (renderer == NULL) {
        fprintf(stderr, "SDL: failed to create renderer: %s\n", SDL_GetError());
    }
}

0 个答案:

没有答案