【问题标题】:Interactive drawing in C#C#中的交互式绘图
【发布时间】:2012-01-05 06:20:21
【问题描述】:

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

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

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

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

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

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

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

我只涉足 WPF。我几乎只在 .Net 中使用 WinForms - WPF 中有什么东西可以大大简化这项任务吗?

【问题讨论】:

    标签: c# directx gdi+ gdi deepzoom


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 就像我说的,我对每个单独的概念都很熟悉和练习,但从来没有像这样将它们组合成一个大型的交互式展示。我可以向您保证,您的建议肯定是有帮助的!谢谢。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • P.S.祝你好运。你想要的都是可能的,但这并不容易。
    猜你喜欢
    • 2021-06-16
    • 2018-07-27
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2021-01-31
    • 2016-05-08
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多