2

我目前有一个带有可滚动面板的表单,它可能包含 100 多个子控件(任何时候只有大约 10 个可以在屏幕上查看)

这会在滚动时导致大量闪烁。

我一直在研究一些双缓冲技术,但它们在我的情况下不起作用,因为我使用了几个子控件(按钮、标签、复选框)并且它们都是独立绘制的。我不能在面板的 OnPaint 方法中做任何影响孩子的事情。

我读过的几个答案指出,添加现有控件需要更多资源,而不是说,而不是标签,只是在顶部绘制一个带有文本的彩色方块。

我有两个主要问题:

  • 如果我不再使用子控件,而只是在面板的 OnPaint 中绘制所有内容,我如何才能仅绘制当前可见的内容(考虑到用户可以滚动)
  • 我将如何实现复选框之类的功能?
4

1 回答 1

1

1)你会得到。scroll_position*one_stepscroll 你会发现开始项目索引 scroll_position*one_stepscroll/item.height -1和最后一个项目索引加上恒定项目大小(panel.height/item.height+1)。然后你会将项目绘制到后台缓冲区(正如你从计算中看到的那样,它的高度当然会大于 panel.height )。然后在面板图形上显示该缓冲区。所以这就是双缓冲的工作原理。`(如果您的控件将包含要绘制的大图像,那么您可以使用一些延迟加载技术。代理模式来加速滚动,请检查:代理模式

1A)如果您的 item.heights 不同,那么您以不同的方式找到第一个项目。我建议您也将每个项目的起始位置存储起来。这样,您将减少计算,而不是每次查找循环投掷项目并添加高度

2)你会得到它的状态并显示状态。例如你可以做。filled rectangle as for checked hollow rectangle for unchecked.(认为它将是您自己的具有附加布尔状态属性的对象,或者只是布尔变量及其 x,y,width,height )。在面板单击上,您将使用可见的复选框项目区域检查单击位置。那么你会改变它的state = !state. 然后再次为可见项目重绘整个面板。

3)第三种方式只是在滚动和使用控件时更改内容。并且滚动步骤将是一个对象移动。相信我,从长远来看,用户更喜欢简单的工作而不是花哨的东西。.just 使用 10 个控件项。和 100 个为它存储值的对象。在滚动时,您只需从 100 个对象更改这 10 个项目的显示属性(文本、状态或图像或其他)。这样,您将使用控件本身。简单的性能和内存解决方案。

于 2013-06-04T19:26:32.027 回答