2012-06-29 2 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); 
    } 
} 

Это не так элегантно, как я надеялся, но он работает безупречно.

 Смежные вопросы

  • Нет связанных вопросов^_^