Testando se item estiver visível na ListView virtual
-
11-09-2019 - |
Pergunta
Eu estou usando um controle ListView no modo virtual e OwnerDraw para exibir uma série de itens. Existe uma maneira de testar se um determinado item é visível (dentro da área de cliente do controle) sem disparar um evento de sorteio ou um evento RetrieveVirtualItem?
O problema é que eu tenho uma discussão de fundo que, periodicamente, adiciona mais itens para o listview. Mas por alguma razão, toda vez que adicionar mais itens (incremento VirtualListSize), ele aciona um RetrieveVirtualItem para o último item adicionado, mesmo que seja longe da faixa visível. E, claro, eu só quero desenhar itens que são realmente visível.
Todas as idéias?
Solução
Em listas virtuais, o Windows aciona eventos RetrieveVirtualItem
em muitos lugares estranhos - e eles são diferentes entre XP, Vista e Win7. Proprietário desenhadas listas virtuais são os piores.
Se o seu objetivo é reduzir o número de eventos RetrieveVirtualItem
, você está fora de sorte.
Se o seu objetivo é reduzir o número de redraws necessárias para as suas fileiras OwnerDrawn
, você vai ser melhor otimizar o redesenho mais diretamente. Por exemplo, você pode capturar o retângulo da região danificada em caso WM_PAINT
, e depois usar isso em seu subitem método de desenho para determinar se que subitem foi danificado.
Ou você pode usar ObjectListView - um invólucro de fonte aberta em torno de um .NET WinForms ListView - que já lidou com este problema. Se você estiver indo para permitir a rolagem horizontal e coluna reorganizando, você realmente fazer querer usar um ObjectListView - por razões explicado aqui .