有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)

Posted

技术标签:

【中文标题】有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)【英文标题】:Is there a way to override the handler called when a user clicks a checkbox in a CListCtrl? (MFC) 【发布时间】:2012-06-29 00:39:13 【问题描述】:

我正在尝试禁用用户更改列表控件中复选框状态的功能。我目前正在务实地改变状态。我已经处理了LVN_ITEMCHANGED 消息,并且由于程序其余部分的布局,尝试更改状态没有选项。我还尝试在用户单击列表控件并简单地重置那里的复选框时进行 HitTest,但这并没有给我我正在寻找的确切结果。

当用户单击复选框本身时,是否发送了特定消息或我可以覆盖的功能?我只想覆盖处理程序或捕获消息,以便它不会去任何地方。

【问题讨论】:

【参考方案1】:

解决方案:

我最终删除了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);
    

这并不像我希望的那样优雅,但它完美无缺。

【讨论】:

以上是关于有没有办法覆盖当用户单击 CListCtrl 中的复选框时调用的处理程序? (MFC)的主要内容,如果未能解决你的问题,请参考以下文章

MFC CListCtrl 右键单击​​标题

如何处理 CListCtrl 中的属性键?

处理 CListCtrl 鼠标点击的问题

有没有办法将 UIView 放在 UIPopoverController 上方?

如何覆盖搜索视图中的向上按钮行为

当用户单击javascript mottie虚拟键盘键之间的小空间时,有没有办法防止焦点从元素模糊?