リストボックスの選択を反転する

複数選択リスト ボックスで項目を選択したり解除するにはSetSel()を使います。
そこでまず、GetCount()でリストボックスの項目数を調べ0からその数までループし
項目の選択状況をGetSel()で調べその反対の選択状態にしていけば良い訳ですが
選択状態にするとその項目までフォーカスが移動してしまい見苦しい結果になってしまいます。
そこで利用するのがSelItemRange()です。
この関数は範囲で複数の項目の状態を設定し、選択してもフォーカスは移動しません。
さらに一度に複数の項目の状態を設定できる為、速度も高速にできます。
これを利用し、コーディングした例を以下に示します。


bool bSel = m_listbox.GetSel(0) != 0;
int nStart = 0;
int nMax = m_listbox.GetCount();
for (int i = 1; i < nMax; ++i)
{
    if ((m_listbox.GetSel(i) != 0) != bSel)
    {
        bSel = !bSel;
        m_listbox.SelItemRange(bSel, nStart, i);
        nStart = i;
    }
}
m_listbox.SelItemRange(!bSel, nStart, nMax);

m_listboxCListBoxのメンバ変数です。

流れを説明すると、まずは0番目の項目の選択状態を取得しフラグに状態を記憶しておきます。
そして次の項目の選択状態を調べフラグと同じならばまたその次を調べ・・・を
反対の状態が出てくるまで繰り返します。
反対の状態が出てきたらフラグを設定した項目から反対の出た項目までを
フラグの反対の状態に項目を変更させます。
その後フラグを反転させ先ほどと同じく反対の状態が出てくるまで調べるを
リストの最後まで繰り返して終了です。

注意点として、フラグは比較する際にBOOL値だとまずいので必ずboolにします。
理由は「BOOL、TRUE、比較、問題」を検索して調べてみてください。

< 戻る << HOME ©1999-2002 by Akky, All right reserved.