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?

Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top