1

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

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

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

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

这是我应该避免使用 GDI 并可能使用 DirectDraw 的东西吗?我不想矫枉过正——我只想能够直观地表示结构并让用户可以选择打印它。

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

我在较小的规模上对每个单独的概念都有经验,但是在这样的大型结构中没有任何东西可以组合在一起。我预测如果我做错了什么,它会变成非常缓慢、滞后和占用内存的事情。

我只涉足WPF。我几乎只在 .Net 中使用 WinForms - WPF 中有什么东西可以使这项任务变得更加容易吗?

4

2 回答 2

1

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

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

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

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

于 2011-11-24T01:03:29.037 回答
1

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

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

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

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

逻辑很简单。让它无闪烁和响应可能不是那么简单。

于 2011-11-24T12:12:37.347 回答