winform中背景播放视频以及透明控件附于其上的相关问题

__Meow 2013-06-26 11:10:23
如题,先上图,这是我之前的UI
,我现在想实现动态背景,由于GIF最高只支持256色,所以决定用DirectShow播放视频文件。
但问题也随之来了,控件(比如Label)的透明色为Transparent,之前静态背景的时候是透到窗体,现在我要在Panel上播放视频,结果就变成了
还请各位大神指点一下,多谢了……附上DirectShow相关调用代码:

public partial class FrmGraph : Form
{
// DirectShow stuff
private IFilterGraph2 graphBuilder = null;
private IMediaControl mediaControl = null;
private IBaseFilter vmr9 = null;
public static IVMRWindowlessControl9 windowlessCtrl = null;
private bool handlersAdded = false;
private string m_filename = null;
private Panel m_Panel = null;

public FrmGraph(string filename, Panel panel)
{
m_filename = filename;
m_Panel = panel;
MBuildGraph(m_filename);
RunGraph();
}

private void CloseInterfaces()
{
if (mediaControl != null)
mediaControl.Stop();

if (handlersAdded)
RemoveHandlers();

if (vmr9 != null)
{
Marshal.ReleaseComObject(vmr9);
vmr9 = null;
windowlessCtrl = null;
}

if (graphBuilder != null)
{
Marshal.ReleaseComObject(graphBuilder);
graphBuilder = null;
mediaControl = null;
}

}

public void MBuildGraph(string fileName)//通过文件名建立Graph
{
int hr = 0;

try
{
graphBuilder = (IFilterGraph2) new FilterGraph();
mediaControl = (IMediaControl) graphBuilder;

vmr9 = (IBaseFilter) new VideoMixingRenderer9();

ConfigureVMR9InWindowlessMode();

hr = graphBuilder.AddFilter(vmr9, "Video Mixing Renderer 9");
DsError.ThrowExceptionForHR(hr);

hr = graphBuilder.RenderFile(fileName, null);
DsError.ThrowExceptionForHR(hr);
}
catch(Exception e)
{
CloseInterfaces();
MessageBox.Show("An error occured during the graph building : \r\n\r\n"
+ e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void ConfigureVMR9InWindowlessMode()
{
int hr = 0;

IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9) vmr9;

// Not really needed for VMR9 but don't forget calling it with VMR7
hr = filterConfig.SetNumberOfStreams(1);
DsError.ThrowExceptionForHR(hr);

// Change VMR9 mode to Windowless
hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless);
DsError.ThrowExceptionForHR(hr);

windowlessCtrl = (IVMRWindowlessControl9) vmr9;

// Set "Parent" window
hr = windowlessCtrl.SetVideoClippingWindow(m_Panel.Handle);
DsError.ThrowExceptionForHR(hr);

// Set Aspect-Ratio
hr = windowlessCtrl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox);
DsError.ThrowExceptionForHR(hr);

// Add delegates for Windowless operations
AddHandlers();

// Call the resize handler to configure the output size
BuildGraph_ResizeMove(null, null);
}

private void AddHandlers()
{
// Add handlers for VMR purpose
this.Paint += new PaintEventHandler(BuildGraph_Paint); // for WM_PAINT
this.Resize += new EventHandler(BuildGraph_ResizeMove); // for WM_SIZE
this.Move += new EventHandler(BuildGraph_ResizeMove); // for WM_MOVE
SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged); // for WM_DISPLAYCHANGE
handlersAdded = true;
}

private void RemoveHandlers()
{
// remove handlers when they are no more needed
handlersAdded = false;
this.Paint -= new PaintEventHandler(BuildGraph_Paint);
this.Resize -= new EventHandler(BuildGraph_ResizeMove);
this.Move -= new EventHandler(BuildGraph_ResizeMove);
SystemEvents.DisplaySettingsChanged -= new EventHandler(SystemEvents_DisplaySettingsChanged);
}

private void RunGraph()
{
if (mediaControl != null)
{
int hr = mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
}
}

private void StopGraph()
{
if (mediaControl != null)
{
int hr = mediaControl.Stop();
DsError.ThrowExceptionForHR(hr);
}
}

private void BuildGraph_Paint(object sender, PaintEventArgs e)
{
if (windowlessCtrl != null)
{
IntPtr hdc = e.Graphics.GetHdc();
int hr = windowlessCtrl.RepaintVideo(m_Panel.Handle, hdc);
e.Graphics.ReleaseHdc(hdc);
}
}

private void BuildGraph_ResizeMove(object sender, EventArgs e)
{
if (windowlessCtrl != null)
{
int hr = windowlessCtrl.SetVideoPosition(null, DsRect.FromRectangle(m_Panel.ClientRectangle));
}
}

private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
if (windowlessCtrl != null)
{
int hr = windowlessCtrl.DisplayModeChanged();
}
}

protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
{
StopGraph();
}
base.WndProc(ref m);
}



public void stop()
{
if (mediaControl != null)
{
int hr = mediaControl.Stop();
StopGraph();
DsError.ThrowExceptionForHR(hr);
}
}

public void play()
{
if (mediaControl != null)
{
int hr = mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
}
}

public void pause()
{
if (mediaControl != null)
{
int hr = mediaControl.Pause();
DsError.ThrowExceptionForHR(hr);
}
}
}
//主窗体调用处(FrmGraph m_graph;)
m_graph = new FrmGraph(Application.StartupPath + "\\WeatherBG\\sunny_night.avi", this.pnlBG);
m_graph.play();
...全文
530 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
__Meow 2013-07-02
  • 打赏
  • 举报
回复
引用 2 楼 kimizhou_blog 的回复:
背景色很难调的,如果实在不行,只能换控件了
还望湿胸不吝赐教……
  • 打赏
  • 举报
回复
背景色很难调的,如果实在不行,只能换控件了
__Meow 2013-06-27
  • 打赏
  • 举报
回复
不要沉啊……自己顶……

17,747

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧