CListCtrlで選択行だけを選択不可にするには?

[戻る]
こう 2006/07/27(木) 14:20:25
環境
OS:WIN2000
VC++.NET

度々お世話になります。

CListCtrlで選択した行を一時的に選択不可にする方法を教えて下さい。
EnableWindowの様に扱いたいです。

どなたかご教授お願いします。

PATIO 2006/07/27(木) 14:32:55
EnabelWindowのように関数を呼べばそうなるようなイメージなら
諦めた方が良いと思います。
CListCtrl自体にそういう機能は無かったはず。
全体に対して無効化する事は出来ますけどね。
中身の特定のアイテムだけを選択不可にするには
かなり作りこまないと駄目でしょう。

例えば、ユーザーがアイテムを選択するのを監視して
選択されては困る物が選択されたら強制的に選択を解除するような
プログラムを自分で組まないとできないと思います。

PATIO 2006/07/27(木) 14:33:37
がーっ、また誤字

誤)
> EnabelWindowのように関数を呼べばそうなるようなイメージなら

正)
EnableWindowのように関数を呼べばそうなるようなイメージなら

こう 2006/07/27(木) 14:40:04
[[解決]]
>PATIOさん
返信ありがとうございます。

やはり作りこむしかないんですね。
それだと時間がかかりすぎるのであきらめます。
ありがとうございました。

敬具

瀬戸っぷ [E-Mail] 2006/07/28(金) 00:42:18
LVN_ITEMCHANGINGあたりを捕捉して、
NMLISTVIEW構造体のiItemやuNewStateで判定して、
CListCtrl::SetItemState()で選択を解除する…とかで出来ませんかね?

# やったコトはないですが。

瀬戸っぷ [E-Mail] 2006/07/28(金) 01:59:09
ちょっと試してみました。

void CListCtrlNoSelDlg::OnLvnItemchangingList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    if(pNMLV->iItem == 1 && (pNMLV->uNewState & (LVIS_SELECTED|LVIS_FOCUSED))){
        *pResult = TRUE;
    } else {
        *pResult = 0;
    }
}

こんな感じで、フォーカスの設定と選択マークの表示は抑制できましたが…
CListCtrl::GetSelectionMark()では選択されていると返ってきました。
まぁ、見ての通りダイアログでやってみただけなんですが。

古いスレッドには追加発言できません。