2011-09-29 39 views
10

Tôi có một CListCtrl (kiểu báo cáo), trong đó tôi xóa danh sách và lặp lại nó vào những thời điểm nhất định. Tôi muốn duy trì vị trí cuộn dọc khi thực hiện việc này. Tôi thấy có một vài phương pháp mà trông đầy hứa hẹn:CListCtrl: Cách duy trì vị trí cuộn?

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

Tôi đang cố gắng GetScrollPos() và sau đó SetScrollPos() nhưng nó không có vẻ hoạt. Cách chính xác đơn giản để lưu vị trí cuộn và sau đó khôi phục nó là gì?

CẬP NHẬT

Trên thực tế có vẻ như tôi có thể nhận được để lưu các GetScrollPos vị trí cuộn() và sau đó SetScrollPos() để khôi phục lại nó, tuy nhiên nó theo nghĩa đen chỉ có vẻ để thiết lập vị trí thanh cuộn và không thực sự di chuyển các mục của CListCtrl của tôi.

UPDATE 2

Phương pháp Scroll() dường như di chuyển một cách chính xác các thanh cuộn nội dung. Tuy nhiên phải mất một đối tượng CSize làm đối số của nó. Vì vậy, câu hỏi sẽ là làm thế nào để dịch giữa CSize và đầu ra của GetTopIndex hoặc GetScrollInfo/Pos.

Trả lời

16

Tôi đã thực hiện điều đó trong quá khứ. IIRC, mẹo được bao gồm trong:

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

Tuyệt vời hoạt động này. Tôi thích một giải pháp bằng cách sử dụng Scroll() nhưng điều này không công việc. Bạn có biết điều gì sẽ xảy ra nếu sau khi bạn gia hạn nội dung của danh sách bạn có ít mục hơn nTopIndex? – User

+0

Tôi đoán EnsureVisible (nTopIndex) sẽ không có hiệu lực. Bạn sẽ kết thúc với danh sách được cuộn xuống dưới cùng. –

+1

Và tại sao M $ không bận tâm để cung cấp một phương pháp SetTopIndex? :-( –

Các vấn đề liên quan