リストビューアイテムの処理


リストビューでの選択されているアイテムの取得

選択されているアイテムを取得するには、以下の処理を行う。
	int a = m_List1.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
これにより、aには現在選択されているアイテムのインデックスが代入される。 何も選択されていない場合は-1となる。
複数選択の場合は、aが-1になるまで繰り返しGetNextItem処理を呼び出せば、 選択されている全てのアイテムのインデックスを取得できる。

目次へ



リストビューにおけるプログラムでのアイテム選択

プログラム内でアイテムの選択を設定(変更)するには、以下の処理を行う。
	m_List1.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
上記の場合は、第1引数に0を指定しているのでインデックス0のアイテムが選択される。
この後フォーカスをリストビューへ当てることで、アイテムの選択状態が明示される。

目次へ



リストビュー上でのクリック位置にあるアイテム、サブアイテムを取得する

リストビュー上でマウスを左クリックしたときに、その位置にあるアイテムを取得するにはCListCtrl::HitTest関数を使う。 この関数は引数で与えられた位置にアイテムがあればそのインデックスを返す。アイテムがなければ-1を返す。
	void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
	{
		// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
		int iItem;
		iItem = HitTest(point);

		……
		CListCtrl::OnLButtonDown(nFlags, point);
	}


また、サブアイテムを取得する場合はCListCtrl::SubItemHitTest関数を使う。
	void CCosmosListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
	{
		// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
		int iItem;
		int iSubItem;
		LV_HITTESTINFO hittest;
		hittest.pt = point;

		SubItemHitTest(&hittest);
		iItem = hittest.iItem;
		iSubItem = hittest.iSubItem;

		……
		CListCtrl::OnLButtonDown(nFlags, point);
	}
ここではLV_HITTESTINFO構造体を使用しているが、この構造体の定義は以下のとおりである。
	typedef struct tagLVHITTESTINFO
	{
	    POINT pt;
	    UINT flags;
	    int iItem;
	#if (_WIN32_IE >= 0x0300)
	    int iSubItem;    // this is was NOT in win95.  valid only for LVM_SUBITEMHITTEST
	#endif
	} LVHITTESTINFO, FAR* LPLVHITTESTINFO;
この構造体のptメンバにクリックされた位置を代入し、この構造体へのポインタを引数としてSubItemHitTest関数を呼び出す。 関数が処理されると、その位置にサブアイテムがあった場合、アイテムのインデックスを構造体のiItemメンバに、 サブアイテムのインデックスをiSubItemメンバに格納されている。サブアイテムがない場合は両方とも-1である。

目次へ



リストビュー上でのアイテム選択を不可にする

CListCtrlリストビューで、アイテムを選択できないようにするためには次のような処理をおこなう。
  1. CListCtrlクラスの派生クラスCMyListCtrlクラスを生成する。
  2. ClassWizardを開き、コントロールの貼り付けられているウィンドウのクラスでCMyListCtrl型のメンバ変数m_list1を作成する。 (ヘッダファイルの記述も忘れずに)
  3. ClassWizardで、CMyListCtrlクラスに「=LVN_ITEMCHANGED」というメッセージのハンドラ関数OnItemchangedを追加する。
  4. CMyListCtrlクラスのソースファイルを開き、以下のように修正。
    void CMyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) {
    
    	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    	// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
    
    	// -------- フォーカスを残す場合はこっちで! --------
    	int iFocus = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
    	if( iFocus != -1 ) {
    		SetItemState(iFocus, ~LVIS_SELECTED, LVIS_SELECTED);
    	}
    	// -------- ここまで --------
    
    	// -------- フォーカスも表示しない場合はこちらで! --------
    	int iFocus = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
    	if( iFocus == -1 )
    		iFocus = GetNextItem(-1, LVNI_ALL | LVNI_FOCUSED);
    	if( iFocus != -1 ) {
    		SetItemState(iFocus,
    			~(LVIS_SELECTED | LVIS_FOCUSED), LVIS_SELECTED | LVIS_FOCUSED);
    	}
    	// -------- ここまで --------
    
    	*pResult = 0;
    }
    

目次へ