1. 程式人生 > >CListCtrl選中某行

CListCtrl選中某行

1、設定CListCtrl選中行

m_list.SetItemState(nIndex,LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);

注意:這句程式碼只是讓指定行高亮顯示,如果使用後再用GetSelectionMark函式來得到選中行,結果往往是錯誤的。比如,先用滑鼠點選選中第5行,呼叫GetSelectionMark函式得到的是4(第5行),再呼叫SetItemState函式選中第2行,然後呼叫GetSelectionMark函式得到的還是4(第5行),所以,需要在設定選中行高亮顯示時,一般與SetSelectionMark函式連用:

m_list.SetItemState(nIndex, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);   //選中行
m_list.SetSelectionMark(nIndexs);

2、取消CListCtrl選中行

m_list.SetItemState(nIndex, 0, LVIS_SELECTED);

m_list.SetSelectionMark(-1);

3、CListCtrl選中行改變

專案中用到ClistCtrl,當選中行改變時,另外一個控制元件的詳細資訊也隨之改變,最開始使用滑鼠點選事件:

void CMyDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
    TODO: Add your control notification handler code here
    int nIndex = m_list.GetSelectionMark();
    if (nIndex >=0)

   {

       //要進行的操作

   }

}

後來發現,用滑鼠點選並不完善,因為如果用鍵盤來切換選中行的話,另一控制元件的資訊就改變不了,於是改用響應LVN_ITEMCHANGED訊息,發現改變選中行時會有好幾個LVN_ITEMCHANGED訊息,加入判斷即可:

void CMyDlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    if(pNMListView->uChanged == LVIF_STATE)
    {
        if(pNMListView->uNewState)
        {
             int nIndex = pNMListView->iItem;

            //要進行的操作

        }

    }
 
 *pResult = 0;
}