zoukankan      html  css  js  c++  java
  • Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录

    介绍

      DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染、交互式音乐和环境音效等高要求应用开发服务的。 

      而Managed DirectX 实质上是对DirectX进行了一个轻量级的封装,Microsoft在2003年10月初发布了Microsoft DirectX 9.0 SDK Update (Summer 2003),其中就着重改进了Managed DirectX部分。一方面使它能与.NET Framework紧密集成,可供.NET 平台下的其他语言调用 (如C#);另一方面对DirectX程序编写进行了进一步简化,使得DirectX向RAD开发的方向又迈进了一大步,如我们所知ASP.NET、 WinForm这些东西是在网络上运行的。使得在网页上看到有硬件加速支持的绚丽的3D动画实时演示成为可能。

      DirectX的核心是DirectX3D,但早期也是有DirectXDraw(2D),后来2D融入到了3D中,原来有个项目的图形展示控件是用DirectDraw实现的,为了纪念这些曾经带来过效益的技术,将这个技术的使用大致讲解下。

    准备工作

      下载5.0以上的Managed DirectX SDK包。

      其中有Microsoft.DirectX.DirectDraw.dll,Microsoft.DirectX.dll 这两个DLL是我们需要的。

    环境搭建

      新建工程DirectXShowDemo,选择Framework2.0(也可以选其他,不过得在app.config中标注下)

    简单Demo

    创建设备

    1         private Device CreateDevice()
    2         {
    3             var device = new Device();
    4 
    5             //目前只做成窗口模式,由于全屏模式需要用到Flip,而窗口模式不用使用Flip
    6             device.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
    7 
    8             return device;
    9         }

    创建切割器

    1         public Clipper CreateCliper()
    2         {
    3             var cp = new Clipper();
    4 
    5             cp.Window = this;
    6 
    7             return cp;
    8         } 

    创建离屏表面

     1         public Surface CreateOffScreenSurface(Bitmap pBitmap, Clipper pClipper)
     2         {
     3             if (pBitmap == null)
     4                 throw new ArgumentNullException("位图不能为空");
     5 
     6             //离屏描述
     7             SurfaceDescription sd = new SurfaceDescription();
     8             sd.SurfaceCaps.OffScreenPlain = true;
     9             Surface surOff = null;
    10 
    11 
    12             surOff = new Surface(pBitmap, sd, _device);
    13 
    14             //设置切割器
    15             if (pClipper != null)
    16             {
    17                 surOff.Clipper = pClipper;
    18             }
    19 
    20             return surOff;
    21         }

    在Paint事件中增加代码

    1         private void Form1_Paint(object sender, PaintEventArgs e)
    2         {
    3             Rectangle recSource = this.DisplayRectangle;
    4             Rectangle recTo = M_RctTrance(this.Size);
    5 
    6             _surPrimary.Draw(recTo, _surBack, recTo, DrawFlags.Wait);
    7         }

    显示效果

    其他

      由于是演示,所以很多异常判断都没做,比如设备丢失,超出显示范围等,做的复杂的可以创建多个图层,且图层上的元素可以拖动,显示Tootip,闪烁,选中等效果,也可以多图层切换。感兴趣可以联系我。

      如果要调试的话,由于DirectXDraw的原因,需要在调试->异常->Managed Debugging Assistants->LoaderLock 取消勾选

    Demo下载

    源码下载

         

      

  • 相关阅读:
    05_python_字典
    04_python_列表
    03_python_基本数据类型
    02_python_while循环/格式化输出/逻辑运算
    01_python_初始python
    vue中v-model的数据双向绑定(重要)
    vue中轮播图的实现
    侦听器watch 监听单个属性
    vue computed监听多个属性
    vue中ajax应用
  • 原文地址:https://www.cnblogs.com/mephisto/p/3669569.html
Copyright © 2011-2022 走看看