Pregunta

Estoy usando un control ListView en modo virtual y OwnerDraw para mostrar una serie de artículos. ¿Hay una manera de comprobar si un determinado elemento es visible (dentro del área cliente del control) sin disparar un evento empate o un evento RetrieveVirtualItem?

El problema es que tengo un subproceso de fondo que agrega periódicamente más elementos a la vista de lista. Pero por alguna razón, cada vez que añadir más elementos (incremento VirtualListSize), se desencadena una RetrieveVirtualItem para el último elemento añadido, a pesar de que en ninguna parte cerca del rango visible. Y, por supuesto, yo sólo quiero dibujar elementos que son realmente visibles.

¿Alguna idea?

¿Fue útil?

Solución

En las listas virtuales, Windows desencadena eventos RetrieveVirtualItem en muchos lugares extraños - y ellos son diferentes entre XP, Vista y Win7. Propietario listas virtuales extraídos son los peores.

Si su objetivo es reducir el número de eventos RetrieveVirtualItem, estás de suerte.

Si su objetivo es reducir el número de redibujado necesarios para sus filas OwnerDrawn, usted estará mejor optimización del nuevo trazado de forma más directa. Por ejemplo, puede capturar el rectángulo de la región dañada en caso WM_PAINT, y luego usar eso en su método de dibujo subtema para determinar si ese subtema fue dañado.

O usted podría utilizar ObjectListView - una envoltura de código abierto en torno a una .NET Windows Forms ListView - que ya ha abordado este problema. Si se va a permitir el desplazamiento horizontal y reordenando columna, realmente quieran utilizar un ObjectListView - por razones explica aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top