2011-11-24 113 views
1

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

除了将排列在树上的块可能会非常复杂的算法之外,我并不确定如何去实现实际的画布和绘制代码。乍一看,我可以创建一个巨大的图像(或一个大图像矩阵),并使用一个GraphicsBufferedGraphics来呈现给定用户放大的一个小区域。这会给缩放平移您可能会在Google地图上看到的效果。

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

这是我应该避免使用GDI,也许使用DirectDraw来代替吗?我不想过度使用 - 我只是想能够直观地呈现结构并让用户选择打印它。

另外,是否有一个(免费软件?)库可用,允许缩放和平移与交互?我可能会问一些,但也许也可以处理树结构?

我对小规模的每个个体概念都有经验,但没有一个像这样的大型结构聚集在一起。我预测如果我做错了什么,它会变成非常缓慢,缓慢和记忆困难的事情。

我只涉猎了WPF。我几乎完全在.Net中使用WinForms - WPF中有什么可以使这个任务变得更容易?

回答

1

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

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

所以要么你使用框架提供的双缓冲图形,要么你自己设计它。如果你想远程运行你的应用程序,这可能不是完美的,但是:http://blogs.msdn.com/b/oldnewthing/archive/2006/01/03/508694.aspx

基本上你只要把你想在一个列表得出,并与inforamtion更新它究竟是在哪里它结束了,你在屏幕上的一切,让你可以在OnMouseDown/OnMouseMove/OnMouseUp中对它进行命中测试。你会很快注意到需要保持一个枚举的交互所在的状态(eg.g DraggingObject,MakingSelection,Scrolling等)和Point_lastMousePosition。

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

+0

就像我说过的,我对每一个人的概念都很熟悉和实践,但从来没有把它整合到一个像这样的大型互动展示中。我可以向你保证,你的建议当然有帮助!谢谢。 – user1002358

+0

很高兴能帮到你! :-) –

1

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

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

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

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

+0

P.S.祝你好运。你想要什么是可能的,但这并不容易。 –