1、对于SDL1.x,可以使用SDL_putenv方法,设置SDL_WINDOWID环境变量,然后再调用SDL_Init初始化SDL,就可以在Win32/MFC 主窗口、子窗口中渲染。例如:(在基于对话框的窗口中放置一个Picture控件,将此控件属性ID设置为IDC_VIEW)char temp[64]={0};sprintf(temp,"SDL_WINDOWID=%u",(unsigned long)hWnd);_putenv(temp);在SDL_Init调用前加入以上的代码即可。_putenv可以使用SDL_putenv() 或者windows的函数SetEnvironmentVariable来设置也是应该可以的。因为SDL1.x的代码是查询SDL_WINDOWID不为空就在此HWND上绘制,否则就会创建新的窗体。
2、对于SDL2.x,你会发现SDL_getenv.h没有了,设置SDL_WINDOWID也没有用,源码中都找不到了。但是SDL2.x提供了SDL_CreateWindowFrom函数,这个函数直接传递窗口句柄即可。代码为:CWnd* pWnd = this->GetDlgItem(IDC_VIEW);SDL_Init(SDL_INIT_VIDEO);window= SDL_CreateWindowFrom(pWnd->GetSafeHwnd());renderer = SDL_CreateRenderer(window, -1, 0);SDL_SetRenderDrawColor(renderer, 0x0, 0x0, 0x0, 0xFF);SDL_RenderClear(renderer);
3、下面还要添加渲染函数,这个需要添加消息:在头文件中添加消息声明:afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);
4、在cpp文件中添加消息映射ON_MESSAGE(WM_KICKIDLE,OnKickIdle)
5、添加WM_KICKIDLE消息实现代码:LRESULT CTSMDlg::OnKickIdle(WPARAM wParam, LPARAM lParam){//add here...}
6、在OnDestroy消息中释放SDL资源,防止内存泄漏,窗体由MFC负责释放就行。SDL_VideoQuit();if(renderer)SDL_DestroyRenderer(renderer);if(window)SDL_DestroyWindow(window);SDL_Quit();