我使用wxScrolledWindow来显示数据(以行和列形式显示)。例如,我有4列和大约1200行(它们都有相同的高度)。例如,第一列代表名称,第二列代表电话号码,等等。这很好,但问题是,由于我已经将所有的1200行添加到wxScrolledWindow中,程序正在消耗大量的内存。
因此,我希望只有用户可以看到的行应该在给定的时间出现在wxScrollWindow中,并且当用户开始滚动时,应该动态地创建其他行。对此进行搜索后,我了解到这被称为虚拟滚动,wxWidgets使用wxLC_VIRTUAL样式在wxListCtrl中提供了这个功能。但问题是,我无法自定义wxListCtrl的外观。例如,假设我的自定义滚动列表中的第3列包含一个带有文本的按钮,第4列包含一些wxStaticText,我希望在保持虚拟滚动的同时更改每一行的高度、背景颜色。
所以,我的问题是:
wxListCtrl的虚拟滚动是基于这个理论的),这样我就可以自己实现它了。请注意,我读过wxWidgets的github回购,但从那里我无法弄清楚,而且我也感到那里缺少文档。wxScrollWindow或任何其他窗口在wxwidget中实现虚拟滚动的工作演示。我的意思是,这样我就可以把它作为一个参考和起点。PS:我也在网上搜索过同样的东西,但是找不到任何文章来展示我们如何在wxwidget中实现虚拟滚动,所以我决定自己问它。
发布于 2022-07-03 17:09:31
没有所谓的“虚拟滚动”,这就是为什么你没有找到任何解释如何去做的原因。wxLC_VIRTUAL标志重用旧的微软术语来调用控件,而不是完全存储它们的数据“虚拟”,但这只是与滚动相关的。
滚动本身就是通过绘制“逻辑画布”来实现的,它可能比它的“物理视图”(即窗口)要大得多,其偏移量由滚动条位置决定。因此,唯一要做的就是正确地设置这个偏移量,这是由PrepareDC()函数wxScrolledCanvas或wxScrolledWindow完成的,这两个函数实际上都是wxScrolled<>模板的专门化。在将wxPaintDC传递给这个函数之后,您应该像往常一样使用它(嗯,也许可以通过不绘制可见区域以外的部分来优化),而根本不关心滚动--但是它会工作,都是独立的。您应该查看滚动示例,以了解这到底是如何工作的。
注意,wxScrolled<>假定您的所有行都具有相同的高度。如果不是这样的话,您可以使用wxVScrolledWindow ("V“表示”变量“,如可变高度行)或继承自它的已经提到的wxVListBox。
允许合理定制的最简单的类是wxSimpleHtmlListBox。
https://stackoverflow.com/questions/72847148
复制相似问题