ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

CListBoxのスクロール制御

CListBoxに、垂直スクロールバーが表示される程度にアイテムが表示されている状態でAddStringやDeleteStringを実行すると、スクロールバーの位置がリセットされ最上位に戻ってしまうことがある。これは、リストボックスの操作をするときに困る挙動だ。

f:id:donadonasan:20160209013102p:plain

これを解決するには、AddStringやDeleteStringをする前にスクロールバーの位置を保存し、処理後にスクロールバーの位置を再設定すれば良い。スクロールバーの位置は、以下の関数で取得・設定できる。これらは、正確には一番上に表示されているアイテムの番号を取得・設定する関数である。

int CListBox::GetTopIndex();

int CListBox::SetTopIndex(int nIndex);

なお、余計なスクロールを抑制するため、以下も併用する。

void CWnd::SetRedraw(BOOL bRedraw = 1);

以下、サンプルコード。