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

C 虚拟Listview控件的(主)缓冲区中应该有多少行?,c,winapi,C,Winapi,虚拟Listview控件的(主)缓冲区中应该有多少行 我正在编写一个纯c语言的Win32 API应用程序。有一个到数据库的ODBC连接,它将检索项目(实际上是行) MSDN示例代码意味着终端缓存的固定大小缓冲区为30(这几乎肯定不是最优的)。我认为端缓存和主缓存的大小应该相同 我的想法是,缓冲区应该大于列表视图一次可以显示的最大项目数。我想每次调整Listivew的大小时都可以重新计算 或者,使用较大的固定值更好吗。如果是,该值是多少?使用ListView\u ApproximateView(或

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

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

MSDN示例代码意味着终端缓存的固定大小缓冲区为30(这几乎肯定不是最优的)。我认为端缓存和主缓存的大小应该相同

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


或者,使用较大的固定值更好吗。如果是,该值是多少?

使用ListView\u ApproximateView(或LVM\u ApproximateView消息)获取视图的垂直高度

使用ListView_GetItemRect(或LVM_GetItemRect消息)获取项目的高度

将“视图矩形高度”除以某个项目的高度,以获得视图中可以容纳的项目数。 对每个大小事件执行此计算


然后相应地创建缓冲区

通知消息将让您知道它将询问多少项。这可以帮助您决定缓存的大小。

@Brian R.Bondy感谢您对如何获取项目数量的明确帮助。事实上,我已经准备好用ListView_GetCountPerPage实现(对于列表或报表视图),我会用你的方式为其他人实现它,尽管我不需要ListView_近似值,因为我已经准备好知道ListView的新大小

@Lars Truijens我已经在使用LVN_ODCACHEHINT,并且考虑过使用它来设置缓冲区大小,但是我需要读取SQL数据的末尾,以找到最后一项来获取从ODBC返回的行数。因为那是填充“end cache”的最佳时间,所以我想在调用LVN_ODCACHEHIN之前,我必须设置项目的数量(并因此填充缓冲区)

我想我真正的问题是优化问题,我想Brian已经暗示了答案。破坏缓冲区和重新分配内存的开销比上网和进行ODBC读取的开销要小,有些人使缓冲区相当小,并且经常更改它

是这样吗

我做了更多的尝试,似乎认为LVN_ODCACHEHINT通常会正确地填充主缓冲区,并且只有在一行(在报告模式下)部分可见时才会错过

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


然后,如果每个WM_大小和LVN_ODCACHEHINT的开始项和结束项编号不同,您将重新读取缓存。

答案似乎是:(或者是我胡乱处理想法时随机收集的笔记)

作为缓冲区的一般回答: 从一定数量开始,在本例中,屏幕已满(我添加了一个额外的行,以防下一行部分未被覆盖),然后每次滚动屏幕时,将缓冲区大小增加一倍(直到内存耗尽之前)

这似乎是错误的。事实证明,大多数加载数据的方法都已准备好缓冲。ODBC对文件I/O的调用。几乎所有我想不出来的东西要么在内存中,要么在运行中重新计算。这意味着答案实际上是:取LVN_ODCACHEHINT中提供的值(并在任意一侧添加1-如果没有整数高度,这似乎工作得更快)