C#:如何在可滚动,可缩放的面板中绘制非常大的控件?

时间:2012-05-30 09:13:08

标签: c# .net winforms controls panel

想象一个条形图,其水平条可能非常宽。我在表单上有一个面板,我想显示这些栏并滚动和缩放它们。表格以及小组可以调整大小。条形图是从数据库动态创建的。每次用户放大或缩小时,都必须重新创建所有条形以在面板上调整它们的大小。

我使用Label控件来创建这些条形图,但问题也适用于所有其他控件:如果我放大得足够远,我的条形图最终将超过控制尺寸的魔术16位边框(> 65536像素)。这使得无法在开始时简单地创建面板上的所有控件,让面板处理滚动。

我的想法:根据滚动条的当前位置和缩放级别,清除所有条形控件的面板,并仅创建当前视图窗口中可见的控件。超出可见视图的条纹将在面板外部缩短,因此它们的最大尺寸受面板尺寸的限制。

我的问题:

  • 哪个Panel事件应该最清晰/创建过程? 可能有成千上万的控件,所以它应该尽可能少。
  • 有没有更好的方法来解决这个问题?也许我从一开始就搞错了。

这个问题不仅出现在巨大的控件上,而且还出现在面板上较小的控件相距很远(> 65536像素)的情况下,所以我认为一个好的解决方案对许多项目都有帮助。

3 个答案:

答案 0 :(得分:2)

我不想创建/销毁控件,或仅为其点击事件隐藏/调整控件大小。创建UserControl并覆盖OnPaint方法以绘制条形图并覆盖OnClickOnMouseXxx事件非常容易。

由于您已经知道“虚拟空间”中条形的位置,因此可以轻松地将鼠标光标的位置映射到条形图(或条形图外部的单击)。

答案 1 :(得分:0)

我知道你说winforms是强制性的,但我真的认为你应该看看wpf视图。您可以在winforms中托管wpf元素。因此,其他所有内容都可以与表单相关,并且您有一个托管和显示控件的面板。我可以写一个快速的例子,可能会为你证明这一点,但如果你不打算这样做,我真的不想浪费我的时间。

答案 2 :(得分:0)

您可以创建图元文件(矢量图形),在图像控件中显示,并手动确定单击哪个逻辑元素。