2012-05-25 55 views
0

我正在開發一個Visual Studio 2008中的MFC應用程序。我有一個CListCtrl對象有複選框。 我想知道是否有一個簡單的方法來使空格鍵切換所有突出顯示的項目。眼下,在空格鍵按下事件我這樣做:Visual Studio MFC CListCtrl複選框 - 空格鍵

void toggleSelect() 
{ 
    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition(); 
    while(pos) 
    { 
     int index = m_cListCtrl.GetNextSelectedItem(pos); 
     BOOL check = m_cListCtrl.GetCheck(index); 
     m_cListCtrl.SetCheck(index, !check); 
    } 
} 

,如果不是因爲我相信,當一個項目高亮顯示爲空格鍵的默認行爲,這會工作(複選框被觸發自動選擇單個項目時)。這個代碼的問題是,總是有一個未被切換的複選框。這是因爲空格鍵切換選定的單個項目的默認行爲。無論如何禁用默認?

回答

1

你說得對。一旦你處理了多個選擇檢查狀態,你可以在代碼中設置列表控制句柄檢查狀態切換。 你必須修改你的代碼。 我只是假設你正在處理LVN_KEYDOWN消息。 (是toggleSelect全球?爲什麼?

void CYourDlgClass::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    LPNMLVKEYDOWN pLVKeyDown = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR); 

    if(VK_SPACE == pLVKeyDown->wVKey && m_cListCtrl.GetSelectedCount() > 1) 
    { 
      toggleSelect(); 
      *pResult = 1; 
      return; 
    } 

    // TODO: Add your control notification handler code here 
    *pResult = 0; 
} 

void CYourDlgClass::toggleSelect() 
{ 
    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition(); 
    while(pos) 
    { 
      int index = m_cListCtrl.GetNextSelectedItem(pos); 
      BOOL check = m_cListCtrl.GetCheck(index); 
      m_cListCtrl.SetCheck(index, !check); 
    } 
} 

設置* pResult 0您表示消息已得到處理,不需要進一步的處理。 我建議從CListCtrl的派生類,並以類似的方式處理WM_KEYDOWN:

void CMultiCheckListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
    if(VK_SPACE == nChar && GetSelectedCount() > 1) 
    { 
      POSITION pos = GetFirstSelectedItemPosition(); 
      while(pos) 
      { 
        int index = GetNextSelectedItem(pos); 
        BOOL check = GetCheck(index); 
        SetCheck(index, !check); 
      } 
      return; 
    } 

    CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
+0

感謝您的詳細答覆,約翰。 我沒有考慮重寫關鍵事件。現在它工作得很好:) –