当前位置:编程学习 > C#/ASP.NET >>

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

如题,先上图,这是我之前的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();
WinForm 控件 --------------------编程问答-------------------- 不要沉啊……自己顶…… --------------------编程问答-------------------- 背景色很难调的,如果实在不行,只能换控件了 --------------------编程问答--------------------
引用 2 楼 kimizhou_blog 的回复:
背景色很难调的,如果实在不行,只能换控件了

还望湿胸不吝赐教……
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,