2009-12-02 5 views
0

Я использую элемент управления ListView в виртуальном режиме и режиме OwnerDraw для отображения нескольких элементов. Есть ли способ проверить, является ли определенный элемент видимым (внутри клиентской области элемента управления), не вызывая событие ничьей или событие RetrieveVirtualItem?Проверка наличия элемента в виртуальном ListView

Проблема в том, что у меня есть фоновый поток, который периодически добавляет больше элементов в список. Но по какой-то причине каждый раз, когда я добавляю больше элементов (увеличивая VirtualListSize), он вызывает RetrieveVirtualItem для последнего добавленного элемента, хотя он нигде не находится рядом с видимым диапазоном. И, конечно, я хочу только рисовать предметы, которые на самом деле видны.

Любые идеи?

+0

Я думал, что событие DrawItem только уволено за видимые предметы. –

+0

Нет, это определенно увольняется каждый раз, когда я изменяю VirtualListSize (для последнего элемента в списке). –

ответ

0

В виртуальных списках Windows запускает RetrieveVirtualItem события во многих странных местах - и они отличаются между XP, Vista и Win7. Худшие владельцы виртуальных списков.

Если ваша цель - уменьшить количество событий RetrieveVirtualItem, вам не повезло.

Если ваша цель - сократить количество перерисовок, необходимых для ваших строк OwnerDrawn, вам будет лучше оптимизировать перерисовку более непосредственно. Например, вы можете захватить прямоугольник поврежденного региона в событии WM_PAINT, а затем использовать его в методе рисования вашего подэлемента, чтобы определить, был ли поврежден этот подэлемент.

Или вы можете использовать ObjectListView - оболочку с открытым исходным кодом вокруг .NET List WinForms ListView, которая уже справилась с этой проблемой. Если вы хотите разрешить горизонтальную прокрутку и перегруппировку столбца, вы действительно действительно хотите использовать ObjectListView - по причинам explained here.

Смежные вопросы