如何在MFC子窗口中使用SDL

2025-10-24 20:00:24

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);

如何在MFC子窗口中使用SDL

3、下面还要添加渲染函数,这个需要添加消息:

在头文件中添加消息声明:

afx_msg LRESULT OnKickIdle(WPARAM wParam, LPARAM lParam);

如何在MFC子窗口中使用SDL

4、在cpp文件中添加消息映射

ON_MESSAGE(WM_KICKIDLE,OnKickIdle)

如何在MFC子窗口中使用SDL

5、添加WM_KICKIDLE消息实现代码:

LRESULT CTSMDlg::OnKickIdle(WPARAM wParam, LPARAM lParam)

{

 //add here...

}

如何在MFC子窗口中使用SDL

6、在OnDestroy消息中释放SDL资源,防止内存泄漏,窗体由MFC负责释放就行。

SDL_VideoQuit();

 if(renderer)

  SDL_DestroyRenderer(renderer);

 if(window)

  SDL_DestroyWindow(window);

 SDL_Quit();

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢