@ Brian R. Bondy Спасибо за подробную помощь по получению количества предметов. На самом деле я был полностью готов к тому, чтобы понять, что это можно сделать (для представления списка или отчета) с ListView_GetCountPerPage, и я бы использовал ваш способ получить его для других, хотя мне не нужен ListView_ApproximateViewRect, так как все будет готово знать новый размер ListView.
@ Lars Truijens Я уже использую LVN_ODCACHEHINT и хотя уже собирался использовать это для установки размера буфера, однако мне нужно прочитать данные SQL до конца, чтобы найти последний элемент, чтобы получить количество строк, возвращаемых из ODBC , Поскольку это было бы наилучшее время для заполнения «конечного кэша», я думаю, что мне нужно установить количество элементов (и, следовательно, заполнить буфер), прежде чем мы получим вызов LVN_ODCACHEHIN.
Полагаю, мой настоящий вопрос - это вопрос оптимизации, на который, по-моему, Брайан намекнул на ответ. Объем накладных расходов на очистку буфера и перераспределение памяти меньше, чем накладные расходы на выход в сеть и чтение ODBC, некоторые делают буфер довольно маленьким и часто меняют его.
Это правильно?
Я немного поигрался, и похоже, что LVN_ODCACHEHINT обычно правильно заполняет основной буфер и пропускает его, только если строка (в режиме отчета) частично видна.
Так что я думаю, что ответ для размера кэша: общее количество отображаемых элементов плюс одна строка отображаемых элементов (поскольку в представлениях значков у вас есть несколько элементов в строке).
Затем вы перечитали бы кэш с каждым WM_SIZE и LVN_ODCACHEHINT, если у каждого из них был разный начальный и конечный номер элемента.