winform中背景播放视频以及透明控件附于其上的相关问题
如题,先上图,这是我之前的UI,我现在想实现动态背景,由于GIF最高只支持256色,所以决定用DirectShow播放视频文件。
但问题也随之来了,控件(比如Label)的透明色为Transparent,之前静态背景的时候是透到窗体,现在我要在Panel上播放视频,结果就变成了
还请各位大神指点一下,多谢了……附上DirectShow相关调用代码:
WinForm 控件 --------------------编程问答-------------------- 不要沉啊……自己顶…… --------------------编程问答-------------------- 背景色很难调的,如果实在不行,只能换控件了 --------------------编程问答--------------------
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();
还望湿胸不吝赐教……
补充:.NET技术 , .NET Framework