선택한 아이템 얻기 - 2 (LVN_ITEMCHANGED)




 리스트 컨트롤에서 특정 아이템을 선택 한 후
MainFrame 의 메뉴에서 리스트에 선택된 아이템 텍스트를 얻어와야 했다.
즉, 리스트 컨트롤에는 특정 아이템이 선택되어진 상태 이고, 추후에 다른 뷰나 클래스에서
리스트 컨트롤에 선택된 아이템의 정보를 얻는 것 이였다.

 방법1)
 선택된 아이템만을 얻고자 한다면 다음 코드를 참고 하면 된다.

for (int i = 0; i < m_list.GetItemCount(); i++)
{
    if (m_list.GetItemState(i, LVIS_SELECTED) & LVIS_SELECTED)
    {
        CString m_sTest;
        m_sTest.Format( "%d\n",i);
    }
}

또는

CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl != NULL);
POSITION pos = pList->GetFirstSelectedItemPosition();

if (pos == NULL)
   TRACE0("No items were selected!\n");
else
{
   while (pos)
   {
      int nItem = pList->GetNextSelectedItem(pos);
      TRACE1("Item %d was selected!\n", nItem);
      // you could do your own processing on nItem here
   }
}


방법2).
 나의 코드에는 리스트 컨트롤의 아이템이 변경 될 경우 발생하는 메시지인 LVN_ITEMCHANGED 의 핸들러를 구현해 놨다.
차라리 위의 방법처럼 조사하고자 할 때 모든 리스트 컨트롤의 아이템을 조사 하지 않고,
LVN_ITEMCHANGED 의 핸들러에서 선택된 아이템을 멤버변수에 저장한 후 나중에 이 멤버함수의 값을 리턴 시키는 형태를 취했다.
이때, 주위할 점은 리스트 컨트롤에 출력되는 리스트가 한 종류가 아니라 다른 종류도 출력이 된다면 언제 그 멤버변수를
초기화 해야 하느냐는 신중히 고려 해야 한다.

void ChRmtEvwrView::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

    if (!(pNMLV->uChanged == LVIF_STATE && pNMLV->uNewState == (LVIS_SELECTED | LVIS_FOCUSED)))
        return;

    INT nSelectItem = pNMLV->iItem;
    if (-1 == nSelectItem)
        return;

    if (LOGINFO_MODE == m_uListOutputMode)
    {
        CMainFrame   *pMainFrame = reinterpret_cast<CMainFrame *>(::AfxGetMainWnd());
        ChRmtEvwrDoc *pDoc       = GetDocument();
        if (NULL == pMainFrame || NULL == pDoc)
            return;

        CString sLogName = _T("");
        sLogName = GetListCtrl().GetItemText(nSelectItem, 0);
        m_sSelectedLogName = sLogName;
    }

*pResult = 0;

}

Posted by six605
,