c#中的交互式绘图

本文关键字:绘图 交互式 | 更新日期: 2023-09-27 18:15:48

我需要在c# WinForms中绘制一个大型的交互式树状结构——一个企业层次结构。

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

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

关于交互性,这里可以做些什么?我希望用户能够突出某些人(在一个特定的成本中心的人,谁是承包商的人,等等……)。此外,如果树随着用户的放大而逐渐显示更多关于员工的信息,那将是非常酷的。我应该只是做命中测试与MouseMove事件和编程地添加/删除/改变的东西,构成画布上的图片?

这是我应该避免使用GDI的东西,也许使用DirectDraw代替?我不想做得太过分——我只是想能够直观地表示结构,并给用户提供打印它的选项。

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

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

我只涉猎过WPF。我几乎只在。net中使用WinForms——WPF中有什么东西可以使这项任务变得更容易吗?

c#中的交互式绘图

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

不想在一个大的位图上画所有的东西。避免大的位图。: -)

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

基本上你只是把你想要绘制的所有东西放在一个列表中,并更新它的信息,告诉它它在屏幕上的结束位置,这样你就可以在OnMouseDown/OnMouseMove/OnMouseUp中对它进行hit-test。您很快就会注意到需要为交互所处的状态保留一个枚举(例如:(DraggingObject, MakingSelection, Scrolling等)和一个Point _lastMousePosition.

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

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

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

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

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