1

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

我使用标签控件来创建这些条,但问题也适用于所有其他控件:如果我放大得足够远,我的条最终将超过控件大小的神奇 16 位边框(> 65536 像素)。这使得不可能在开始时简单地在面板上创建所有控件并让面板处理滚动。

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

我的问题:

  • 这个清除/创建过程最好在哪些小组活动中进行?可能有数千个控件,所以应该尽可能少。
  • 有没有更好的方法来处理这个?也许我从一开始就搞错了。

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

4

3 回答 3

2

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

由于您已经知道条在“虚拟空间”中的位置,因此很容易将鼠标光标的位置映射到条(或在条外单击)。

于 2012-05-30T12:00:48.707 回答
0

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

于 2012-05-30T11:59:10.610 回答
0

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

于 2012-05-30T12:30:06.083 回答