还在苦苦敲代码开发APP?你out啦! 试试积木搭建APP吧~

选中CListCtrl指定行并发送LVN_ITEMCHANGED消息

来源:个人博客     2016-05-17 11:30:52    人气:     我有话说( 0 人参与)

在使用CListCtrl列表控件的程序中,当我们修改了CListCtrl后需要要定位到已修改的行,可以使用下面的函数实现: 定位并使指定行选中m_list...

在使用CListCtrl列表控件的程序中,当我们修改了CListCtrl后需要要定位到已修改的行,可以使用下面的函数实现:

//定位并使指定行选中
m_listReport.EnsureVisible(nIndex,FALSE);
m_listReport.SetItemState(nIndex,LVIS_SELECTED,LVIS_SELECTED);

但这远远不能满足需要,因为这种定位不具有在指定行上面鼠标单击选中的效果,为此我们需要向CListCtrl控件发送LVN_ITEMCHANGED消息,LVN_ITEMCHANGED是CListCtrl的WM_NOTIFY消息,其消息映射形式为ON_NOTIFY(TCN_SELCHANGE, IDC_TAB, &CWorkAidDlg::OnTcnSelchangeTab),向指定控件发送WM_NOTIFY消息是一件比较麻烦的事情,该程序实现的 完整代码如下:

//使CListCtrl选中指定行并向CListCtrl发送LVN_ITEMCHANGED消息
//发送LVN_ITEMCHANGED消息
NMLISTVIEW nmlv ;
memset(&nmlv, 0, sizeof (nmlv)) ;
nmlv.hdr.hwndFrom = m_listReport.m_hWnd;
nmlv.hdr.idFrom = m_listReport.GetDlgCtrlID();//GetDlgCtrlId() ;0x00190ca4
nmlv.hdr.code = LVN_ITEMCHANGED;
nmlv.iItem = nIndex ;
nmlv.iSubItem = 0;
nmlv.uNewState = 3 ;
nmlv.uOldState = 0;
nmlv.uChanged = LVIF_STATE;
nmlv.lParam = 0;
m_listReport.GetParent()->SendMessageA(WM_NOTIFY,nmlv.hdr.idFrom,(LPARAM)(&nmlv));

通过以上代码,我们就在VC程序中实现了自定义向CListCtrl控件发送LVN_ITEMCHANGED消息,其效果和鼠标在指定行上面单击是一样的!

CListCtrl LVN_ITEMCHANGED

本文源自互联网,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,
版权归原作者,如有问题请联系service@tsingfun.com (编辑:admin)
分享到: