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下载



【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?