none
WPF使用DirectX(Direct2D)示例 RRS feed

  • 问题

  • 没用过DirectX,现WPF工程想用DirectX(Direct2D)来绘制波形。

    有人有这方面的示例吗?

    越简单越好,入门级别,哪怕只是绘制一条线,一个文本,一个矩形都可以。


    • 已编辑 oneonce 2017年8月26日 6:44
    2017年8月26日 6:05

答案

  • WPF有三种方式来显示DirectX绘制的内容。

    1. 直接将WPF窗口的句柄传给DirectX。这种方式的优点是代码简单性能还好,缺点是DirectX将霸占整个窗口。一般用于演示和游戏,比如你的窗口中只需要显示波形,不需要有其它控件也不需要交互(当然可以用另一个窗口来“遥控”)。

    2. 第二种方式是用D3DImage。这种方式的优点是D3DImage是从ImageSource类派生的,因此它可以通过Image控件完美的集成到WPF可视树中,不会破坏WPF的布局。缺点是,微软的重心早就转到UWP那边去了,WPF十年来几乎没什么改进,因此至今D3DImage的D3DResourceType中仍然只有一个IDirect3DSurface9类型。也就是说只能支持D3D9,然而D3D9早就淘汰了,所以要想用D3DImage来做只能使用VS2010或更低的版本才行,但这样一来即用不了C++11,也没办法用D2D。

    3. 用WinForm组件来做。这种方法的优点是,它既不会霸占整个窗口也能在当前的VS中开发。缺点是在WPF中添加WinForm组件后,WinForm组件会置于顶层,因此不能有其它控件在其上面,而且在WinForm组件上面进行的所有交互(比如鼠标点击)都会被WinForm组件拦截,传不到WPF里面来。另外以这种方式使用DirectX时会出现闪烁,当然你不是做游戏的话问题不大。

    你要示例的话,得先说明你要哪一种方式的示例,或者说你的项目到底有哪些需求。另外你要绘制的波形有多少数据点?每秒要画多少帧?图面有多大?即使是DirectX,在普通1920*1080分辨率的显示器上,画一万个点也是相当耗时的。因为你这些点每一次都要动态添加,不像游戏那样只需要载入一次。

    • 已标记为答案 oneonce 2017年8月28日 0:53
    2017年8月27日 14:13
  • 我这有WinForm方式的示例:https://code.msdn.microsoft.com/WPF-d0b87d9e
    • 已标记为答案 oneonce 2017年8月28日 10:05
    2017年8月28日 3:22

全部回复

  • WPF有三种方式来显示DirectX绘制的内容。

    1. 直接将WPF窗口的句柄传给DirectX。这种方式的优点是代码简单性能还好,缺点是DirectX将霸占整个窗口。一般用于演示和游戏,比如你的窗口中只需要显示波形,不需要有其它控件也不需要交互(当然可以用另一个窗口来“遥控”)。

    2. 第二种方式是用D3DImage。这种方式的优点是D3DImage是从ImageSource类派生的,因此它可以通过Image控件完美的集成到WPF可视树中,不会破坏WPF的布局。缺点是,微软的重心早就转到UWP那边去了,WPF十年来几乎没什么改进,因此至今D3DImage的D3DResourceType中仍然只有一个IDirect3DSurface9类型。也就是说只能支持D3D9,然而D3D9早就淘汰了,所以要想用D3DImage来做只能使用VS2010或更低的版本才行,但这样一来即用不了C++11,也没办法用D2D。

    3. 用WinForm组件来做。这种方法的优点是,它既不会霸占整个窗口也能在当前的VS中开发。缺点是在WPF中添加WinForm组件后,WinForm组件会置于顶层,因此不能有其它控件在其上面,而且在WinForm组件上面进行的所有交互(比如鼠标点击)都会被WinForm组件拦截,传不到WPF里面来。另外以这种方式使用DirectX时会出现闪烁,当然你不是做游戏的话问题不大。

    你要示例的话,得先说明你要哪一种方式的示例,或者说你的项目到底有哪些需求。另外你要绘制的波形有多少数据点?每秒要画多少帧?图面有多大?即使是DirectX,在普通1920*1080分辨率的显示器上,画一万个点也是相当耗时的。因为你这些点每一次都要动态添加,不像游戏那样只需要载入一次。

    • 已标记为答案 oneonce 2017年8月28日 0:53
    2017年8月27日 14:13
  • 我这有WinForm方式的示例:https://code.msdn.microsoft.com/WPF-d0b87d9e
    • 已标记为答案 oneonce 2017年8月28日 10:05
    2017年8月28日 3:22
  • 非常感谢~~
    2017年8月28日 10:05