2008-09-06 13 views
1

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

我知晓纯“C”对Win32 API的应用程序。有一个到数据库的ODBC连接将检索项目(实际上是行)。

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

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

或者,它只是更好地与大型的固定值去。如果是这样的价值是什么?

回答

1

使用ListView_ApproximateViewRect(或LVM_APPROXIMATEVIEWRECT消息)来获取视图矩形高度。

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

除以项目的高度视图矩形的高度,获得可以适合您的视图中的项目数量。 对每个尺寸事件进行此计算。

然后相应地创建您的缓冲区。

1

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

0

@布赖恩河邦迪感谢怎么办获得的项目数量明确的帮助。事实上,我已经准备好了,可以通过ListView_GetCountPerPage来理解它可以完成的事情(用于列表或报告视图),并且我会用你的方式为其他人获取它,尽管我不需要ListView_ApproximateViewRect,因为我将全部准备好了解ListView的新大小。

@Lars Truijens我已经在使用LVN_ODCACHEHINT,并且虽然有关于使用它来设置缓冲区大小,但是我需要读取到SQL数据的末尾来查找最后一个项目以获取从ODBC。由于这将是填充'最终缓存'的最佳时间,所以我认为在调用LVN_ODCACHEHIN之前,我必须设置项目的数量(并因此填充缓冲区)。

我想我真正的问题是优化我认为布赖恩暗示的答案之一。废弃缓冲区和重新分配内存的开销量小于外出访问网络和执行ODBC读取的开销,有些缓冲区会使缓冲区相当小并且经常会改变它。

这是正确的吗?

我已经做了一些更多的工作,似乎认为LVN_ODCACHEHINT通常正确填充主缓冲区,并且只有在行(在报告模式下)部分可见时才会丢失。

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

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

0

答案似乎是:(或票据随机收集我的想法摆弄)

至于缓冲区一个笼统的回答: 一些量全面启动,在这种情况下,屏幕(我添加额外的行以防下一个部分被发现),然后每次滚动屏幕时,加倍缓冲区大小(直到内存用完为止)。

这似乎是错误的。事实证明,加载数据的大多数方法都可以缓冲。 File I/O的ODBC调用。几乎所有不是我能想到的事情都是在记忆中,或是在飞行中重新计算。这意味着答案确实是:取LVN_ODCACHEHINT中提供的值(并在任一侧添加1 - 如果没有整体高度,似乎工作得更快)。

相关问题