CListCtrl Checkbox 被点击消息捕获 判断单击 click响应 单击消息 单击状态

本文详细介绍了如何在C++编程中使用ListView控件并自定义响应ItemChanged事件的函数。通过具体实例展示了如何在ListView控件上实现对项状态改变的检查与响应,提供了简洁且直观的代码实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文来自:http://blog.163.com/danshiming%40126/blog/static/10941274820134244250444/

找了很多,有说响应NM_CLICK的,有说响应ItemChanged的,还是上面网址的哥们好使。不过我这里放出函数的创建过程,方便初学者,大家拿去happy吧。

1、在h文件定义函数:

afx_msg  void CDlgFIFO::OnItemchangedListFifoGroup(NMHDR* pNMHDR, LRESULT* pResult) ;

2、在c文件定义响应:

ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_GRAPHICS_OPTION,&CSubChildDlgCanView::OnItemChangedListCtrl)

3、在c文件定义函数体:

void CDlgFIFO::OnItemchangedListFifoGroup(NMHDR* pNMHDR, LRESULT* pResult) 
{
LPNMITEMACTIVATE   pNMLV   =   (LPNMITEMACTIVATE)pNMHDR;
if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(1)) /* old state : unchecked */ 
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(2)) /* new state : checked */ 
) 
{ 
TRACE("Item(行) %d subItem(列) %d is checked\n", pNMLV->iItem,pNMLV->iSubItem); 
} 
else if((pNMLV->uOldState & INDEXTOSTATEIMAGEMASK(2)) /* old state : checked */ 
&& (pNMLV->uNewState & INDEXTOSTATEIMAGEMASK(1)) /* new state : unchecked */ 
) 
{ 
TRACE("Item %d is unchecked\n", pNMLV->iItem); 
} 
else 
{ 
TRACE("Item %d does't change the check-status\n", pNMLV->iItem); 
} 
*pResult = 0;
}

好了,尽情享受吧。顺便说一下NM_CLICK也是可以的,不过要挨个判断checkbox,没有我们这个直观方便。


<think>嗯,用户的问题是关于如何在MFC应用程序中处理CListCtrl控件内复选框的消息响应方法。首先,我需要回忆一下MFC中CListCtrl的相关知识。CListCtrl是用于显示列表视图的控件,支持多种样式,比如报告视图、图标视图等。当涉及到复选框时,通常使用LVS_EX_CHECKBOXES扩展样式来启用复选框。 接下来,用户提到的是处理复选框的消息响应。根据经验,标准的CListCtrl在启用复选框后,当用户点击复选框时,控件会发送LVN_ITEMCHANGED通知消息。因此,处理这个通知消息应该是关键步骤。需要确认是否需要手动处理复选框的状态变化,或者是否有其他消息需要处理。 然后,考虑到用户可能使用的是自定义的控件,比如CGridListCtrlEx,引用了资料中的CGridListCtrlEx和CGridCell类。这可能意味着用户正在使用一个扩展的列表控件,可能覆盖了默认的消息处理机制。在这种情况下,可能需要重写特定的消息处理函数,比如WM_LBUTTONDOWN,或者在自定义的单元格类中处理鼠标事件。 另外,用户提供的引用中提到在表格中添加按钮并触发事件,这可能涉及到自定义绘制和消息处理。对于复选框来说,可能需要类似的方法,即检测用户点击的位置是否是复选框区域,然后更新状态并发送通知。 可能的步骤包括: 1. 启用复选框样式:使用LVS_EX_CHECKBOXES扩展样式。 2. 添加LVN_ITEMCHANGED的消息映射和处理函数,检查状态变化是否为复选框点击。 3. 对于自定义控件,可能需要处理鼠标点击事件判断点击位置是否在复选框上,并手动更新状态。 需要验证标准CListCtrl的处理方法是否适用,或者是否需要针对自定义控件进行调整。同时,考虑到用户可能遇到的常见问题,比如如何正确获取复选框的状态,如何处理多选情况等,应在回答中提及这些点。 最后,确保提供的代码示例正确,并符合MFC的消息处理机制。例如,使用ON_NOTIFY宏映射LVN_ITEMCHANGED消息,并在处理函数中使用NM_LISTVIEW结构来获取项的状态变化。</think>在MFC中处理$CListCtrl$控件内复选框的消息响应,可以通过以下步骤实现: ### 1. 启用复选框样式 首先为控件添加$LVS_EX_CHECKBOXES$扩展样式: ```cpp m_listCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); ``` ### 2. 消息映射处理 在对话框类中添加消息映射: ```cpp BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CMyDialog::OnLvnItemchangedList) END_MESSAGE_MAP() ``` ### 3. 状态检测函数 实现消息处理函数检测复选框状态变化: ```cpp void CMyDialog::OnLvnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if ((pNMLV->uChanged & LVIF_STATE) && ((pNMLV->uOldState & LVIS_STATEIMAGEMASK) != (pNMLV->uNewState & LVIS_STATEIMAGEMASK))) { BOOL bChecked = m_listCtrl.GetCheck(pNMLV->iItem); TRACE(_T("Item %d check state: %d\n"), pNMLV->iItem, bChecked); } *pResult = 0; } ``` ### 4. 自定义控件处理(针对CGridListCtrlEx) 若使用扩展控件,需重写鼠标事件: ```cpp void CGridListCtrlEx::OnLButtonDown(UINT nFlags, CPoint point) { LVHITTESTINFO hitTestInfo = {0}; hitTestInfo.pt = point; SubItemHitTest(&hitTestInfo); if ((hitTestInfo.flags & LVHT_ONITEMSTATEICON)) { BOOL bNewState = !GetCheck(hitTestInfo.iItem); SetCheck(hitTestInfo.iItem, bNewState); GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), LVN_ITEMCHANGED), (LPARAM)m_hWnd); } CListCtrl::OnLButtonDown(nFlags, point); } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值