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 个项目的显示属性(文本、状态或图像或其他)。这样,您将使用控件本身。简单的性能和内存解决方案。