我的一个类继承于CListCtrl,第一列是checkbox, 用ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
来捕获click事件,现在遇到几个难题:
1 在onclick里不知道如何得到用户点击的是哪一行?
2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
3 onclick点一次执行2次请高手指教,在线等,立即结。

解决方案 »

  1.   

    1 在onclick里不知道如何得到用户点击的是哪一行?
    用HitTest函数检查点击选中的行。鼠标位置用GetCursorPos,然后ScreenToClient进行转换。
    2 在onclick里checkbox状态没有更新,比如没选中时点一下,检查到并不是已经选中?是不是onclick里还没有更新checkbox状态?
    应该是还没有更新吧。如果你实际的效果就是这样。
    3 onclick点一次执行2次
    怎么会呢?是否是你的程序再次激发了该事件?
      

  2.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=210183LVS_EX_CHECKBOXES属性的CListCtrl怎样获得复选框选中的动作。
      

  3.   

    为何没有用classwizard生成的OnClick事件呢?这个事件的参数pNMHDR中,会得到当前选中行的信息
      

  4.   

    谢谢,第一个问题我查了老贴,解决了。
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    int row = pNMListView->iItem;3 onclick点一次执行2次
    怎么会呢?是否是你的程序再次激发了该事件?我这个Clistctrl是加在一个ccontrolbar里,作为这个controlbar 的一个tab,不过这个controlbar没写onclick事件啊,不解。
      

  5.   

    To: vcmuete:OnItemChanged中判断uNewState  &  LVIS_STATEIMAGEMASK判断uNewState  &  LVIS_STATEIMAGEMASK
    这句话我不懂啊。
    另外我是动态创建的,消息函数要自己写的。
      

  6.   

    第2个问题也解决了,查了老贴:
    void CEditList::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
    {

    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if (pNMListView->uOldState == 0 && pNMListView->uNewState == 0)
    return;    // No change // Old check box state
    BOOL bPrevState = (BOOL)(((pNMListView->uOldState & LVIS_STATEIMAGEMASK)>>12)-1);  
    if (bPrevState < 0)    // On startup there's no previous state 
    bPrevState = 0; // so assign as false (unchecked) // New check box state
    BOOL bChecked = (BOOL)(((pNMListView->uNewState & LVIS_STATEIMAGEMASK)>>12)-1);   
    if (bChecked < 0) // On non-checkbox notifications assume false
    bChecked = 0;  if (bPrevState == bChecked) // No change in check box
    return;
    else
    {
    CMainFrame* pMainFrame=(CMainFrame*)::AfxGetMainWnd();
    CUIView *pView = (CUIView*) (pMainFrame->m_wndSplitter.GetPane(0,1));
    if(bChecked)
    {
    // 这里加入后台思考
    }
    else
    {
    //这里停止后台思考
    }
    } *pResult = 0; 
    return ; }现在就差第3个问题,为什么onclick和onitemchanged点一次执行二次。
      

  7.   

    这有什么好奇怪的,如果你先在ListCtrl里选中一项,再单击选中另一项时,OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)还会执行三次呢!但只有当pNMListView->uNewState值为3时,pNMListView->iItem才是当前新的选中项。NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    int row = pNMListView->iItem;if(pNMListView->iItem != -1 && pNMListView->uNewState == 3)
    {
       // pNMListView->iItem为新选中项的索引值
    }
      

  8.   

    onitemchanged点一次执行二次 很正常 onclick就不清楚了
      

  9.   

    此问题我也遇到过,经分析是这样的:
    onclick事件处理函数写到派生类里,当click事件发生时,派生类会执行一次,而此时该派生类实例存在于一个容器中,该容器还要再转发一次click事件,所以会执行两次解决办法:改写或重载容器类的OnNotify,以下是代码,过滤的是COLUMNCLICK事件BOOL CXXXXXX::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
    {
    CWnd *wndParent = this->GetParent(); if(wndParent)
    {
    if(lParam)
    {
    if( ((NMHDR *) lParam)->code != LVN_COLUMNCLICK )
    {
    *pResult = wndParent->SendMessage(WM_NOTIFY,wParam,lParam);
    }
    }
    } return CXXXXXX::OnNotify(wParam, lParam, pResult);
    }