2012-06-29 25 views
1

我想禁用用戶改變列表控件中複選框狀態的能力。我目前正在務實地改變國家。我已經處理了LVN_ITEMCHANGED消息,並且試圖改變狀態,由於程序其餘部分的佈局,所以沒有選項。當用戶點擊列表控件並簡單地重置複選框時,我也嘗試過使用HitTest,但是這並沒有給我提供我正在尋找的確切結果。有沒有辦法來覆蓋用戶點擊CListCtrl中的複選框時調用的處理程序? (MFC)

當用戶單擊複選框本身時,是否有發送的特定消息或我可以覆蓋的功能?我只想重寫處理程序或捕獲消息,以便它不會去任何地方。

回答

0

解決方案:

我結束了去除LVS_EX_CHECKBOXES標誌,並創建了自己的實現。這樣只有一種方法來更改圖標。從前面的問題讀鏈接給了我一個設置「忙」標誌的想法,否則我會得到堆棧溢出錯誤。

// In my dialog class 
m_CListCtrl.SetImageList(&m_ImgList, LVSIL_SMALL); // Custom checkboxes (only two images) 

// ... 
void CMyDialog::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    if(busy) { return; } 
    // .... 
} 

// When calling the SetCheck function: 
busy = TRUE; // Avoid stack overflow errors 
m_CListCtrl.SetCheck(index, fCheck); 
busy = FALSE; 

// I derived a class from CListCtrl and did an override on the get/set check: 
class CCustomListCtrl : public CListCtrl 
{ 
    BOOL CCustomListCtrl::SetCheck(int nItem, BOOL fCheck) 
    { 
     TCHAR szBuf[1024]; 
     DWORD ccBuf(1024); 
     LVITEM lvi; 
     lvi.iItem = nItem; 
     lvi.iSubItem = 0; 
     lvi.mask = LVIF_TEXT | LVIF_IMAGE; 
     lvi.pszText = szBuf; 
     lvi.cchTextMax = ccBuf; 
     GetItem(&lvi); 
     lvi.iImage = (int)fCheck; 
     SetItem(&lvi); 
     return TRUE; 
    } 
    // Just need to determine which image is set in the list control for the item 
    BOOL CCustomListCtrl::GetCheck(int nItem) 
    { 
     LVITEM lvi; 
     lvi.iItem = nItem; 
     lvi.iSubItem = 0; 
     lvi.mask = LVIF_IMAGE; 
     GetItem(&lvi); 
     return (BOOL)(lvi.iImage); 
    } 
} 

這不像我所希望的那樣優雅,但它的工作完美無瑕。

相關問題