
How many rows should be in the (main) buffer of a virtual Listview control?虚拟Listview控件的(主)缓冲区中应有多少行? 我正在用Win32 API的纯" c"样式显示一个应用程序。到数据库的ODBC连接将检索项目(实际上是行)。 MSDN示例代码暗含一个30的固定大小的缓冲区,用于端缓存(几乎肯定不是最佳选择)。我认为末端缓存和主缓存应具有相同的大小。 我的想法是缓冲区应该大于列表视图一次可以显示的最大项目数。我想每次调整Listivew的大小时都可以重新计算? 或者,采用较大的固定值是否更好?如果是这样,那是什么值? LVN_ODCACHEHINT通知消息将使您知道它要询问多少个项目。这可以帮助您确定缓存的大小。 使用ListView_roximateViewRect(或LVM_APPROXIMATEVIEWRECT消息)获取视图的矩形高度。 使用ListView_GetItemRect(或LVM_GETITEMRECT消息)获取项目的高度。 将视图区域的高度除以项目的高度,以获取可以容纳在视图中的项目数。 然后相应地创建缓冲区。 答案似乎是:(或者我随便摆弄想法的随机笔记集) 作为缓冲区的一般答案: 这似乎是错误的。事实证明,大多数加载数据的方式都已准备好进行缓冲。文件I / O的ODBC调用。我几乎无法想到的所有东西要么都在内存中,要么是即时重新计算的。这意味着答案确实是:采用LVN_ODCACHEHINT中提供的值(并在每侧加1-如果您没有整数的高度,这似乎工作得更快)。 @Brian R. Bondy感谢您对如何获得物品数量的明确帮助。实际上,我已经准备好以自己的方式了解可以使用ListView_GetCountPerPage来完成此操作(对于列表视图还是报表视图),并且我将使用您的方式将其用于其他对象,尽管自从我不需要ListView_近似ViewRect以来,所有人都将知道ListView的新大小。 @Lars Truijens我已经在使用LVN_ODCACHEHINT了,尽管已经使用它来设置缓冲区大小,但是我需要读到SQL数据的末尾以找到最后一项,以获取从ODBC返回的行数。由于那是填充"结束缓存"的最佳时间,我想我必须先设置项目数量(并因此填充缓冲区),然后才能调用LVN_ODCACHEHIN。 我想我的真正问题是优化,我认为Brian暗示了答案。浪费缓冲区和重新分配内存的开销小于进入网络并进行ODBC读取的开销,有些会使缓冲区很小,并且经常更改它。 这是对的吗? 我已经做了很多工作,似乎认为LVN_ODCACHEHINT通常可以正确填充主缓冲区,并且仅当部分行(在报告模式下)可见时才会丢失。 因此,我认为缓存大小的答案是:显示项的总数,加上一行显示项(因为在图标视图中,每行有多个项)。 然后,如果每个WM_SIZE和LVN_ODCACHEHINT具有不同的开始和结束项目编号,则将重新读取该缓存。 |