2011-09-29 20 views
10

Ho un CListCtrl (stile report) in cui cancello l'elenco e lo ripopolamento in determinati momenti. Mi piacerebbe mantenere la posizione di scorrimento verticale quando lo fai. Vedo che ci sono un paio di metodi che sembrano promettenti:CListCtrl: come mantenere la posizione di scorrimento?

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

sto cercando GetScrollPos() e poi SetScrollPos(), ma non sembra funzionare. Qual è il modo più semplice per salvare una posizione di scorrimento e successivamente ripristinarla?

UPDATE

In realtà sembra che posso ottenere per salvare le GetScrollPos posizione di scorrimento() e poi SetScrollPos() per ripristinare esso, tuttavia letteralmente sembra proprio di impostare la posizione della barra di scorrimento e in realtà non scorrere gli elementi del mio CListCtrl.

UPDATE 2

Il metodo di scorrimento() sembra scorrere correttamente le barre di scorrimento e il contenuto. Tuttavia prende un oggetto CSize come argomento. Quindi la domanda sarebbe come tradurre tra CSize e l'output di GetTopIndex o GetScrollInfo/Pos.

risposta

16

L'ho fatto in passato. IIRC, il trucco consisteva in:

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

Grande questo funziona. Preferirei una soluzione usando Scroll() ma questo fa il lavoro. Sai fuori mano cosa succede se dopo aver rinnovato i contenuti della lista hai meno elementi allora nTopIndex? – User

+0

Immagino che ConfirmVisible (nTopIndex) non abbia alcun effetto. Finirai con un elenco scorrendo verso il basso. –

+1

E perché M $ non si è preoccupato di offrire un metodo SetTopIndex? :-( –

Problemi correlati