ffmpeg+SDL+windows 视频播放器的开发(三)

时间:2023-01-07 12:02:23

还是想写点记录,免得以后忘了,前几天一直遇到一个问题:

我把SDL 生成的 screen 嵌到MFC中,我的第一想法,就是覆盖:把生成的SDL窗口直接放到指定的位置。

可以,我把SDL 的API翻了个遍,就是没有对应的函数,一个偶尔的机会,我发现了 DIB_CreateWindow (在文件SDL_dibevents.c中)中有这样一段代码:

int DIB_CreateWindow(_THIS)
{
char *windowid;

SDL_RegisterApp(NULL, 0, 0);

windowid = SDL_getenv("SDL_WINDOWID");
SDL_windowid = (windowid != NULL);
if ( SDL_windowid ) {
#if defined(_WIN32_WCE) && (_WIN32_WCE < 300)
/* wince 2.1 does not have strtol */
wchar_t *windowid_t = SDL_malloc((SDL_strlen(windowid) + 1) * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, windowid, -1, windowid_t, SDL_strlen(windowid) + 1);
SDL_Window = (HWND)wcstol(windowid_t, NULL, 0);
SDL_free(windowid_t);
#else
SDL_Window = (HWND)((size_t)SDL_strtoull(windowid, NULL, 0));
#endif
if ( SDL_Window == NULL ) {
SDL_SetError("Couldn't get user specified window");
return(-1);
}

/* DJM: we want all event's for the user specified
window to be handled by SDL.
*/
userWindowProc = (WNDPROCTYPE)GetWindowLongPtr(SDL_Window, GWLP_WNDPROC);
SetWindowLongPtr(SDL_Window, GWLP_WNDPROC, (LONG_PTR)WinMessage);
} else {
SDL_Window = CreateWindow(SDL_Appname, SDL_Appname,
(WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX),
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, SDL_Instance, NULL);
if ( SDL_Window == NULL ) {
SDL_SetError("Couldn't create window");
return(-1);
}
ShowWindow(SDL_Window, SW_HIDE);
}

/* JC 14 Mar 2006
Flush the message loop or this can cause big problems later
Especially if the user decides to use dialog boxes or assert()!
*/
WIN_FlushMessageQueue();

return(0);
}

这个时候才明白,原来SDL 创建窗口也是走windows创建窗口的流程,这个就有思路啦,我要能得到这个窗口的句柄就好啦,我欣喜的找了好久API,终于还是找不到,又是晕了,当我再次仔细读代码的时候,发现当SDL_WINDOWID 如果有环境变量了,就可以指定窗口了,我试着给它指定环境变量,指定已经创建好的窗口,代码如下:在初始化窗口了之后,加了如下代码:

SDL_Init(flags);
atexit(SDL_Quit);// 注册SDL_Quit,当退出时调用,使得退出时程序自动清理

if(hWnd){
this->sdlHWnd = hWnd ;
WCHAR wch[20],iwch[20];
_ltow((long)hWnd,iwch,10);
SetEnvironmentVariable(AnsiToUnicode("SDL_WINDOWID",wch,20),
iwch); //设置环境变量
}

flags = SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF |SDL_RESIZABLE |SDL_NOFRAME;
Surf_Display = SDL_SetVideoMode(surWidth,surHeight,0,flags);

SDL_Flip(Surf_Display);

终于终于,OK啦,但我还不知道这样有没有副作用,目前还没有找到相关的文件,但是目前也没有什么大的问题,希望在进一步的试验过程中不会有什么大的问题。