最近做一个有关数据库的程序,我通过一个ListCtrl来显示记录结果,为了能显示记录的详细资料,我对列表框添加了一个鼠标响应事件,
void CLibraryDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
POSITION pos=m_list.GetFirstSelectedItemPosition();//m_list是定义的CListCtrl对象
if(pos==NULL)
return;
int nItem=m_list.GetNextSelectedItem(pos);
………
}
这样返回的nItem 就是记录所在的行数
在移动键盘的上下箭头时,记录条会上下滚动,为了使滚动时记录的详细资料也能随之改变,我又添加了一个对键盘的响应事件
void CLibraryDlg::OnLvnKeydownList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
*pResult = 0;
if(pLVKeyDow->wVKey==VK_UP||pLVKeyDow->wVKey==VK_DOWN)
{
POSITION pos=m_list.GetFirstSelectedItemPosition();
if(pos==NULL)
return;
int nItem=m_list.GetNextSelectedItem(pos);
………
}
结果发现nItem的值是胡乱显示的
哪位大虾知道这是为什么?
敬请赐教!

解决方案 »

  1.   

    要响应记录变化,响应LVN_ITEMCHANGED消息就可以了.
      

  2.   

    响应LISTCTRL的选中变化即可
    void ***Dlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    *pResult = 0;
    }
      

  3.   

    我也试过LVN_ITEMCHANGED消息:
    void ***Dlg::OnItemchangedList(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    AfxMessageBox("fef");//1
    *pResult = 0;
    }发现不管是用鼠标还是键盘,item改变时1都被调了三次,弹了三下对话框。这就是OnItemChanged()的内部实现问题了。
    楼主可以加断点查一下,问题应该和我类似