2011-09-29 14 views
10

Tengo un CListCtrl (estilo de informe) en el que borro la lista y la repobulo en determinados momentos. Me gustaría mantener la posición de desplazamiento vertical al hacer esto. Veo que hay un par de métodos que parecen prometedores:CListCtrl: ¿Cómo mantener la posición de desplazamiento?

EnsureVisible() 
GetScrollPos() 
SetScrollPos() 
GetScrollInfo() 
GetTopIndex() 
Scroll() 

Estoy intentando GetScrollPos() y luego SetScrollPos(), pero no parece estar funcionando. ¿Cuál es la forma correcta y sencilla de guardar una posición de desplazamiento y luego restaurarla?

ACTUALIZACIÓN

En realidad, parece que puede llegar a salvar a los GetScrollPos posición de desplazamiento() y luego SetScrollPos() para restaurarlo, sin embargo, literalmente, sólo parece fijar la posición de la barra de desplazamiento y en realidad no desplazarse los artículos de mi CListCtrl.

ACTUALIZACIÓN 2

El método de desplazamiento() parece desplazarse correctamente las barras de desplazamiento y los contenidos. Sin embargo, se necesita un objeto CSize como argumento. Entonces la pregunta sería cómo traducir entre CSize y el resultado de GetTopIndex o GetScrollInfo/Pos.

Respuesta

16

Lo he hecho en el pasado. IIRC, el truco consistió en:

int topIndex= m_List.GetTopIndex(); 
RenewContents(); 
m_List.EnsureVisible(m_List.GetItemCount() - 1); // Scroll down to the bottom 
m_List.EnsureVisible(topIndex);// scroll back up just enough to show said item on top 
+0

Genial esto funciona. Preferiría una solución usando Scroll() pero esto hace el trabajo. ¿Sabes lo que sucede si después de renovar el contenido de la lista tienes menos elementos entonces nTopIndex? – User

+0

Supongo que EnsureVisible (nTopIndex) no tendrá ningún efecto. Terminará con una lista desplazada hacia abajo. –

+1

¿Y por qué M $ no se molestó en ofrecer un método SetTopIndex? :-( –

Cuestiones relacionadas