10

CListCtrl (レポート スタイル) を使用して、リストをクリアし、特定の時間に再作成します。これを行うときに、垂直スクロール位置を維持したいと思います。有望に見えるいくつかの方法があることがわかりました。

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

GetScrollPos() と SetScrollPos() を試していますが、機能していないようです。スクロール位置を保存して後で復元する簡単で正しい方法は何ですか?

アップデート

実際には、スクロール位置 GetScrollPos() を保存してから SetScrollPos() を保存して復元できるようですが、文字通りスクロールバーの位置を設定しているように見え、実際には CListCtrl の項目をスクロールしません。

更新 2

Scroll() メソッドは、スクロールバーとコンテンツを正しくスクロールしているようです。ただし、引数として CSize オブジェクトを取ります。したがって、問題は、CSize と GetTopIndex または GetScrollInfo/Pos の出力との間でどのように変換するかです。

4

2 に答える 2

19

私は過去にそれをしました。IIRC、トリックは次のように構成されていました。

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
于 2011-09-30T14:44:58.687 に答える
0

それを行う別の方法は次のようになります。

CRect r;
m_lcList.GetItemRect(0, r, LVIR_BOUNDS);
int scrollPos = m_lcList.GetTopIndex() * r.Height();
RenewContents();
m_lcList.Scroll(CSize(0, scrollPos));
于 2020-03-26T03:36:21.207 に答える