如何在MFC子窗口中使用SDL
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();