在对话框上放了一个CListCtrl控件,想用响应LVN_ITEMCHANGED来处理列表中选项的改变,不过每改变一次选项响应函数OnItemchangedXXX()总被执行3遍,为什么?如何解决?

解决方案 »

  1.   

    补充一下:这个对话框是mode对话框,CListCtrl类型为Report。
      

  2.   

    第一次:uNewState = 0
      uOldState = 2
      其他不变
    第二次:uOldState = 1;
      其他不变
    第三次:item = 你选择的item
      iSubItem = 你选择的SubItem
      uNewState = 3
      uOldState = 0why? 郁闷ing
      

  3.   

    三次消息触发分别为一次老的ITEM得到选择,二次老的ITEM被失去选择,三次改变后的新项目被选择。void CTestDialog::OnItemChangedList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
      NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
      static BOOL bIgnoreNextChange=FALSE;  // for debug only : Note, flags in CAPITALS if set!
      TRACE(
        "Item=%2d (Old=%s,%s,%s,%s) (New=%s,%s,%s,%s) (Change=%s,%s,%s,%s) ",
        pNMListView->iItem,
        (pNMListView->uOldState&LVIS_CUT)?"CUT":"cut",
        (pNMListView->uOldState&LVIS_DROPHILITED)?"DROP":"drop",
        (pNMListView->uOldState&LVIS_FOCUSED)?"FOCUS":"focus",
        (pNMListView->uOldState&LVIS_SELECTED)?"SELECT":"select",
        (pNMListView->uNewState&LVIS_CUT)?"CUT":"cut",
        (pNMListView->uNewState&LVIS_DROPHILITED)?"DROP":"drop",
        (pNMListView->uNewState&LVIS_FOCUSED)?"FOCUS":"focus",
        (pNMListView->uNewState&LVIS_SELECTED)?"SELECT":"select",
        (pNMListView->uChanged&LVIF_TEXT)?"TEXT":"text",
        (pNMListView->uChanged&LVIF_IMAGE)?"IMAGE":"image",
        (pNMListView->uChanged&LVIF_PARAM)?"PARAM":"param",
        (pNMListView->uChanged&LVIF_STATE)?"STATE":"state");  if (pNMListView->iItem >= 0)
      {
        if ((pNMListView->uOldState&LVIS_FOCUSED) && 
          !(pNMListView->uNewState&LVIS_FOCUSED))
        {
          bIgnoreNextChange = TRUE;
        }
        else if ((pNMListView->uNewState&LVIS_SELECTED) && 
          !(pNMListView->uOldState&LVIS_SELECTED))
        {
          // Got a new selection here !
          RequeryList2(pNMListView->iItem);
          TRACE("SELECTED=%s",m_list1.GetItemText(pNMListView->iItem,0));
          bIgnoreNextChange = FALSE;
        }
        else if ((pNMListView->uOldState&LVIS_SELECTED) && 
          !(pNMListView->uNewState&LVIS_SELECTED))
        {
          if (!bIgnoreNextChange)
          {
            // Got a "no selection" here !
            RequeryList2(-1);
            TRACE("SELECTED=NONE");
          }
          bIgnoreNextChange = FALSE;
        }
      }
      TRACE("\n");
      *pResult = 0;
    }
    上面的代码可以看见触发的情况。
      

  4.   

    可以响应NM_CLICK事件并且判断ITEM是否改变过
      

  5.   

    我现在就是响应NM_CLICK事件那么做的,但是这样用上下箭头改变选项时会没有响应。