SSブログ

MFC リストコントロール 行の削除 [PC]

珍しくプログラムのネタです。
今ちょっとMFCを使ったWindowsのプログラムを作成しています。
ダイアログにリストコントロールを配置してリスト上で選択した
行を削除する処理を実装しているところです。
リストコントロールの行すべてを削除するのであれば
BOOL DeleteAllItems();
で一発ですが選択行を削除するというメソッドは存在しません。
リストから1行削除するのであれば
BOOL DeleteItem(int nItem);
が使用できますが削除する行を指定する必要があります。

選択行のインデックスを取得するには
POSITION GetFirstSelectedItemPosition() const;
int GetNextSelectedItem(POSITION& pos) const;
を利用します、MSのサイトでは以下の様なサンプルが紹介されています。
POSITION pos = m_myListCtrl.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
int nItem = m_myListCtrl.GetNextSelectedItem(pos);
TRACE(_T("Item %d was selected!\n"), nItem);
// ここに選択行の処理を書く
}
}
この例では、nitemがインデックスなので
m_myListCtr.DeleteItem(nitem);
を書けばいいような気がしますが、これは間違いです、ここで
行を削除してしまうとリストの状態が変化してしまいます(選択が1行で
あればこれでも消えます、そもそも1行で有ればwhileも不要ですね)。

結局、選択行をすべて消すためには、毎回GetFirstSelectedItemPositionを
呼び出す必要があるようです。

pList = (CListCtrl*)GetDlgItem(IDC_LIST);
POSITION pos = pList->GetFirstSelectedItemPosition();
while (pos)
{
int nLine = pList->GetNextSelectedItem(pos);
pList->DeleteItem(nLine);
pos = pList->GetFirstSelectedItemPosition();
}
こんな感じ。
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。