虚拟Listview控件的(主)缓冲区中应包含几行?

时间:2020-03-05 18:48:37  来源:igfitidea点击:

虚拟Listview控件的(主)缓冲区中应该有几行?

我正在用Win32 API的纯c语言编写应用程序。到数据库的ODBC连接将检索项目(实际上是行)。

MSDN示例代码隐含了一个30的固定大小的缓冲区,用于端缓存(这几乎肯定不是最佳选择)。我认为末端缓存和主缓存应具有相同的大小。

我的想法是缓冲区应该大于列表视图一次可以显示的最大项目数。我想每次调整Listivew的大小时都可以重新计算?

或者,采用较大的固定值是否更好?如果是这样,那有什么价值?

解决方案

回答

使用ListView_roximateViewRect(或者LVM_APPROXIMATEVIEWRECT消息)获取视图矩形的高度。

使用ListView_GetItemRect(或者LVM_GETITEMRECT消息)获取项目的高度。

将视图矩形高度除以项目的高度,即可得到适合视图的项目数。
对每个大小事件进行此计算。

然后相应地创建缓冲区。

回答

LVN_ODCACHEHINT通知消息将让我们知道它要询问多少个项目。这可以确定缓存应该有多大。

回答

@Brian R. Bondy感谢我们对如何获得物品数量的明确帮助。实际上,我已经准备好以自己的方式了解可以使用ListView_GetCountPerPage来完成此操作(对于列表视图还是报表视图),并且我将使用方式将其用于其他对象,尽管自从我不需要ListView_近似ViewRect以来,所有人都将知道ListView的新大小。

@Lars Truijens我已经在使用LVN_ODCACHEHINT了,尽管已经使用它来设置缓冲区大小,但是我需要读到SQL数据的末尾以找到最后一项,以获取从ODBC返回的行数。因为那是填充"结束缓存"的最佳时间,所以我认为必须先设置项数(并因此填充缓冲区),然后才能调用LVN_ODCACHEHIN。

我想我的真正问题是优化,我认为Brian会提示答案。浪费缓冲区和重新分配内存的开销小于进入网络并进行ODBC读取的开销,有些开销使缓冲区很小并经常更改它。

这是正确的吗?

我做了很多工作,似乎认为LVN_ODCACHEHINT通常可以正确填充主缓冲区,并且仅当行(在报告模式下)部分可见时才会丢失。

因此,我认为缓存大小的答案是:显示项目的总数,加上显示项目的一行(因为在图标视图中,每行有多个项目)。

然后,如果每个WM_SIZE和LVN_ODCACHEHINT具有不同的开始和结束项目编号,则将重新读取该缓存。

回答

答案似乎是:(或者随便弄乱想法的随机笔记集)

作为缓冲区的一般答案:
从一定数量开始,在这种情况下,屏幕已满(我添加了额外的一行,以防部分隐藏下一个),然后每次滚动屏幕时,将缓冲区大小加倍(直到内存不足之前的大小) )。

这似乎是错误的。事实证明,大多数加载数据的方式都已准备好进行缓冲。文件I / O的ODBC调用。我无法想到的几乎所有内容都在内存中,或者是即时重新计算的。这意味着答案确实是:采用LVN_ODCACHEHINT中提供的值(并在任一侧加1,如果没有整数高度,这似乎会更快地工作)。