2013-12-16 71 views
1

在MFC對話框中,我用複選框使用了CListCtrl。我想禁用複選框選擇,以便用戶一次只能選擇一個複選框。什麼是實現this.I最好的辦法這樣做只有CListCtrl中的單個選擇MFC中的複選框

void SomeClass::OnClickList(NMHDR *pNMHDR, LRESULT *pResult) 
    { 
     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); 


     int nSelectedItemIndex = -1; 
     nSelectedItemIndex = m_ListCtrl.GetNextItem(-1, LVNI_SELECTED); 
     int nCount = m_ListCtrl.GetItemCount();  
     for(int nItem = 0; nItem < nCount; nItem++) 
     { 
      m_ListCtrl.SetCheck(nItem,false); 
     } 
     if(nSelectedItemIndex != -1) 
      m_ListCtrl.SetCheck(nSelectedItemIndex,true); 

     *pResult = 0; 
    } 

不知怎的,我覺得這個方法是不那麼恰當的,並且可以由其他方式更好。歡迎所有的建議。

編輯:更新:編寫代碼後,一切正常,但我面臨一個新問題。 在OnItemChanged消息處理函數中調用SetCheck()函數,它再次調用同一函數,創建一個遞歸。因此,選擇更改速度很慢。如何避免這一點,請幫助。 ????

回答

1

創建控件時請確保使用此樣式LVS_SINGLESEL

它在CreateEx/CreateEx函數中傳遞。也可以從資源編輯器中獲得(如果通過它添加了控件)。

+1

我已經從recource視圖中檢查了listctrl屬性。單選被設置爲true。但是我仍然可以一次選擇多個複選框。可能是我誤導了你,在我的問題上說了多重選擇,實際上它是一個多選擇複選框的問題。 –

1

最後我解決了它。現在複選框和選擇工作在標準。選擇複選框選擇行,反之亦然,可以進行一個選擇。代碼:

void SomeClass::ResetAllCheckBox() 
    { 
     int nCount = m_ListCtrl.GetItemCount(); 
     for(int nItem = 0; nItem < nCount; nItem++) 
     { 
      m_ListCtrl.SetCheck(nItem,false); 
     } 

    } 

    //Handler for ON_NOTIFY(NM_CLICK,...) 
    void SomeClass::OnClickList(NMHDR *pNMHDR, LRESULT *pResult) 
    { 
     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); 
     NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 
     LVHITTESTINFO hitinfo; 
     int nPosCB=-1,nPos=-1; 
     hitinfo.pt = pNMListView->ptAction; 

     //Make the hit test... 
     nPosCB = m_ListCtrl.HitTest(&hitinfo); 

     if(hitinfo.flags != LVHT_ONITEMSTATEICON) 
      return; 
     ResetAllCheckBox(); 

     nPos = m_ListCtrl.GetNextItem(-1,LVNI_SELECTED); 
     m_ListCtrl.SetItemState(nPos, ~LVIS_SELECTED, LVIS_SELECTED); 
     m_ListCtrl.SetItemState(nPosCB, LVIS_SELECTED, LVIS_SELECTED); 
     m_ListCtrl.SetSelectionMark(nPosCB); 
     *pResult = 0; 
    } 


    //Handler for ON_NOTIFY(LVN_ITEMCHANGED,...) 
    void SomeClass::OnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult) 
    { 
     LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); 
     int nPos = -1; 

     ResetAllCheckBox(); 

     nPos = m_ListCtrl.GetNextItem(-1,LVNI_SELECTED); 
     if(nPos != -1) 
      m_ListCtrl.SetCheck(nPos); 

     int nCount = m_ListCtrl.GetItemCount(); 
     int nSelectedItemIndex = -1; 
     for(int nItem = 0; nItem < nCount; nItem++) 
     { 
      if(m_ListCtrl.GetCheck(nItem)== 1) 
       nSelectedItemIndex = nItem; 
     } 

     *pResult = 0; 
    } 
相關問題