C#中的交互式绘图

时间:2011-11-24 00:37:53

标签: c# directx gdi+ gdi deepzoom

我需要在C#WinForms中绘制一个大型的交互式树结构 - 一个公司层次结构。

除了将在树中排列块的算法可能会非常复杂,我还不确定如何实现实际画布和绘图代码。

乍一看,我可以创建一个巨大的图像(或一个大图像矩阵),并使用GraphicsBufferedGraphics渲染一个给定用户放大位置的小区域。这将提供您在Google地图上可能会看到的缩放平移效果。

至于互动性,可以在这做什么?我希望用户能够突出显示某些人(特定成本中心的人员,承包商的人员等等)。此外,如果随着用户放大更多,树会逐渐显示有关员工的更多信息,那将是非常酷的。我是否应该使用MouseMove事件进行命中测试并以编程方式添加/删除/更改构成画布上图片的内容?

这是我应该避免使用GDI并且可能使用DirectDraw吗?我不想过度使用 - 我只是希望能够直观地表示结构并为用户提供打印选项。

或者,是否有(免费软件?)库可以使用交互式进行缩放和平移?我可能会问一点,但也许一个也可以处理树结构?

我对每个概念都有较小规模的经验,但是没有像这样的大型结构。我预测,如果我做错了什么,它可能变成非常缓慢,迟滞和记忆力的东西。

我只涉足WPF。我几乎完全在.Net中使用WinForms - 在WPF中有什么能让这项任务变得更加容易吗?

2 个答案:

答案 0 :(得分:1)

假设您要使用WinForms,一种选择是为每个需要公开交互的项目创建自己的自定义控件。

然后创建另一个自定义控件来容纳它们和主画布。给它一个画布(例如Panel)和几个滚动条。

使用滚动条时,根据需要动态创建和删除子控件。超出某个缩放级别,您可能需要从控件切换到直接绘制的非交互式图像。

此模型假定用户不会一次与多个控件交互。如果你提供一个套装,让他们选择多个项目,事情就会变得很快。

答案 1 :(得分:1)

我不知道这是否是一个答案,但我使用GDI +做了很多交互式图形工作,我觉得我可以非常有效地使用它。无论是你所描述的树形结构,还是多功能的布局编辑器,以及浏览照片等,都可以实现。

想要的是在大位图上绘制所有内容。避免使用大位图。 : - )

因此,您可以使用框架提供的双缓冲图形,也可以自行设计。如果您想远程运行应用程序,这可能并不完美:http://blogs.msdn.com/b/oldnewthing/archive/2006/01/03/508694.aspx

基本上你只是将你想要绘制的所有内容都放在一个列表中,然后用信息更新它在屏幕上的确切位置,以便你可以在OnMouseDown / OnMouseMove / OnMouseUp上对它进行测试。您很快就会注意到需要保持枚举以确定交互所处的状态(例如,DraggingObject,MakingSelection,Scrolling等)和Point _lastMousePosition。

逻辑非常简单。使其无闪烁且响应迅速可能 简单。