CListBoxのスクロール制御
CListBoxに、垂直スクロールバーが表示される程度にアイテムが表示されている状態でAddStringやDeleteStringを実行すると、スクロールバーの位置がリセットされ最上位に戻ってしまうことがある。これは、リストボックスの操作をするときに困る挙動だ。
これを解決するには、AddStringやDeleteStringをする前にスクロールバーの位置を保存し、処理後にスクロールバーの位置を再設定すれば良い。スクロールバーの位置は、以下の関数で取得・設定できる。これらは、正確には一番上に表示されているアイテムの番号を取得・設定する関数である。
int CListBox::GetTopIndex();
int CListBox::SetTopIndex(int nIndex);
なお、余計なスクロールを抑制するため、以下も併用する。
void CWnd::SetRedraw(BOOL bRedraw = 1);
以下、サンプルコード。