绑定播放窗口
必须在Sdl.SDL_Init之前执行 Sdl.SDL_putenv
同时SDL_SetVideoMode里播放窗口长宽不能大于绑定窗口的长宽
int i = Sdl.SDL_putenv("SDL_WINDOWID=" + panel2.Handle.ToString()); if (i != 0) { MessageBox.Show("SDL初始化失败!"); return false; }
视频窗口缩放
如果需要设置播放窗口随窗口大小变化而变化,则会发现dock等属性无效,需要把绑定的播放控件大小设为非常大,至少大于全屏分辨率吧,然后在frm_Resize事件里处理
private void frm_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { return; } int PlayVideoWidth = this.Width - 50; //根据窗体的宽度获取获取视频播放区域的宽度 int PlayVideoHeight = this.Height - 40;//窗体宽带减去左右控件宽度及窗体边框宽度,可能有一两个像素的误差 surfacePtr = Sdl.SDL_SetVideoMode(PlayVideoWidth, PlayVideoHeight, 0,Sdl.SDL_SWSURFACE | Sdl.SDL_RESIZABLE); rect = new Sdl.SDL_Rect(0, 0, (short)(PlayVideoWidth), (short)(PlayVideoHeight)); }
这里不需要修改SDL_CreateYUVOverlay的大小,CreateYUVOverlay的大小为视频分辨率,DisplayYUVOverlay则为播放窗口的大小
SDL_SetVideoMode的参数显示新的显示大小,而SDL_CreateYUVOverlay(只需建立一次,SDL_SetVideoMode更换时,不需要跟着更换)的参数则是图片的原始大小 。
而在SDL_DisplayYUVOverlay中用到的SDL_Rect,大小则和SDL_SetVideoMode一样,也就是新的显示大小。
对应未绑定播放窗口的需要在这里处理,鼠标事件 ev.type == Sdl.SDL_VIDEORESIZE