在使用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消息,其效果和鼠标在指定行上面单击是一样的!