如何仅在.net Forms 2.0 CF中绘制可查看的内容

时间:2013-06-04 16:37:14

标签: c# .net compact-framework onpaint

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

滚动时会导致大量闪烁。

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

我读到的几个答案表明,添加现有的控件需要更多的资源而不是标签,而不是标签,只需在顶部绘制带有文字的彩色方块。

我有两个主要问题:

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

1 个答案:

答案 0 :(得分:1)

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

1A)如果你的item.heights不同,那么你找到第一个项目的方式不同。我会 建议你表现出来存放每个项目的位置。这样你会的 减少计算而不是每次都找到循环投掷项目并添加高度

2)你将得到它的状态并显示状态。例如,你可以做。 filled rectangle as for checked hollow rectangle for unchecked。(认为它将是你自己的对象,带有额外的布尔状态属性,或者只是布尔变量及其x,y,宽度,高度)。单击面板,你将检查点击位置和可见的复选框项目区域。然后你会改变它的state = !state。然后,您将再次重新绘制整个面板以查看可见项目。

3)第三种方式只是在滚动和使用控件时更改内容。滚动步骤将是一个对象移动。相信我,从长远来看,用户更喜欢简单的工作,而不是高级萨满的事情。 。只使用10个控制项目。以及为其存储值的100个对象。在滚动时,您只需从100个对象中更改这10个项目的显示属性(文本,状态或图像或其他)。通过这种方式,您将使用控件本身。也可以轻松解决性能和内存问题。