代码触发clistctrl控件的NM_CLICK事件

首先,这是个比较简单的功能,也就是实现CListCtrl控件可以处理完当前行后自动换到下一行而且自已选中,思路很简单,先给CListCtrl控件添加个NM_CLICK事件响应函数,手动或者自动都行。

然后用代码选中需要显示的行,代码如下:
m_List.SetFocus()
m_List.SetItemState(nItem,LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);

m_List.SetFocus()
m_List.SetItemState(nItem,LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);

第一句需要添加,网上有的贴子写选中行时没有添加第一行,也就是没有设置焦点,这样第二句不会生效,也就是不会选中。

选中之后,剩下的就是给窗口发事件通知了,其实我们这个事件的过程是当用户手动点击了List控件的某一行时,控件知道自己被点击了,然后给父窗口发送事件通知,而父窗口收到通知后会查相应的事件响应,查找到对应的响应函数。所以,我们要做的就是模拟用户单击CListCtrl控件,给窗口发消息。

代码很简单,如下:

NMLISTVIEW nmListView;
nmListView.iItem = nItem; //告诉响应函数选中的是第几行,如果为-1则为不选中
nmListView.hdr.code = 事件类型(我们这里写NM_CLICK);
nmListView.hdr.idFrom = 控件ID; nmListView.hdr.hwndFrom = 控件自己的窗口句柄;
::SendMessage(响应的窗口句柄,WM_NOTIFY,NULL,(LPARAM)&nmListView);

NMLISTVIEW nmListView;
nmListView.iItem = nItem; //告诉响应函数选中的是第几行,如果为-1则为不选中
nmListView.hdr.code = 事件类型(我们这里写NM_CLICK);
nmListView.hdr.idFrom = 控件ID; nmListView.hdr.hwndFrom = 控件自己的窗口句柄;
::SendMessage(响应的窗口句柄,WM_NOTIFY,NULL,(LPARAM)&nmListView);

嗯嗯。很简单吧,虽然很简单,但还是发出来,给有需要的同学用用!!

本文出自 “西边太阳” 博客,请务必保留此出处http://thgenius.blog.51cto.com/1042803/1337542

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC CListCtrl控件可以响应多种事件,以下是常见的事件及其处理函数: 1. LVN_ITEMCHANGED:当列表项的选中状态改变时触发。可以使用以下代码处理: ``` void CMyDialog::OnItemChangedListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uChanged & LVIF_STATE) && (pNMListView->uNewState & LVIS_SELECTED)) { // 处理选中项改变事件 } *pResult = 0; } ``` 2. LVN_COLUMNCLICK:当列表头的某一列被单击时触发。可以使用以下代码处理: ``` void CMyDialog::OnColumnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int nColumn = pNMListView->iSubItem; // 处理列单击事件 *pResult = 0; } ``` 3. LVN_BEGINLABELEDIT:当用户开始编辑某一项时触发。可以使用以下代码处理: ``` void CMyDialog::OnBeginLabelEditListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLvdi = (LV_DISPINFO*)pNMHDR; LVITEM* pItem = &(pLvdi->item); *pResult = FALSE; // 设置为TRUE表示禁止编辑 } ``` 4. LVN_ENDLABELEDIT:当用户完成编辑某一项时触发。可以使用以下代码处理: ``` void CMyDialog::OnEndLabelEditListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { LV_DISPINFO* pLvdi = (LV_DISPINFO*)pNMHDR; LVITEM* pItem = &(pLvdi->item); // 处理编辑完成事件 *pResult = 0; } ``` 5. LVN_ITEMACTIVATE:当用户双击某一项或按下回车键时触发。可以使用以下代码处理: ``` void CMyDialog::OnItemActivateListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // 处理项激活事件 *pResult = 0; } ``` 6. LVN_GETDISPINFO:当控件需要获取某一项的信息时触发。可以使用以下代码处理: ``` void CMyDialog::OnGetDispInfoListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NMLVDISPINFO* pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); LVITEM& lvItem = pDispInfo->item; // 设置项的信息 *pResult = 0; } ``` 7. LVN_DELETEITEM:当某一项被删除时触发。可以使用以下代码处理: ``` void CMyDialog::OnDeleteItemListCtrl(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pNMLV = reinterpret_cast<NMLISTVIEW*>(pNMHDR); // 处理删除项事件 *pResult = 0; } ``` 以上是常见的事件及其处理函数,开发者可以根据实际需求选择相应的事件进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值