我花了最近几天试图将SDL2显示器嵌入到wxWidgets中但却失败了。好的,这就是我到目前为止......
首先是一个小细节:
我搜索了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());
}
}