不会 2次 除非 程序 中, 自己 又 SelectItem

解决方案 »

  1.   

    在这个过程当中,我没有操作任何其他界面上的东西,而且处理的时候也没有调用过SelectItem之类的函数
      

  2.   

    本帖最后由 VisualEleven 于 2014-06-09 22:15:50 编辑
      

  3.   

    怎么响应 在 void CMainFrame:: 里 ?
    view 呢?
      

  4.   

    ON_NOTIFY_REFLECT(TVN_SELCHANGING, OnSelchanging)
    void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    // *pResult = 1;

    *pResult = 0;
    }
      

  5.   

    响应到框架窗口为了方便,因为很多其他的业务也跟Mainfrm有关联。
      

  6.   

    还是一样的要接受到两次通知。
    这个是打印跟踪的结果:
    CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115
    CDeviceManagerView::OnSelChanging pItemData:3a83808, line:119
    CDeviceManagerView::OnSelChanged treeItem:0, line:143
    CDeviceManagerView::OnSelChanging treeItem:0, line:115
    CDeviceManagerView::OnSelChanged treeItem:74c420, line:143
    CDeviceManagerView::OnSelChanged pItemData:3a53078, line:147
      

  7.   

    void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    afxDump << "entry \n";
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    CMainFrame   *pMain=(CMainFrame*)AfxGetMainWnd();
    // get LeftTree
    CTreeCtrl&  LeftTree=GetTreeCtrl();
    TVITEM *pNew=NULL;
    pNew=&(pNMTreeView->itemNew);
    // Get tree data
    if(pNew->hItem)
    {
    afxDump << "has new\n";
    CShellPidl::LPTVITEMDATA lptvid=(CShellPidl::LPTVITEMDATA)LeftTree.GetItemData(pNew->hItem);
    // set listview
    CMyExploreView   *pRight=pMain->GetRightPane();
    if(lptvid) pRight->PopulateList(lptvid);
    }
    //
    *pResult = 0;
    }
    上面的结果是:entry 
    has new
      

  8.   

    只用
    if(pNew->hItem)
    不行吗
    .
      

  9.   

    哦,这样只能控制切换后发生的事情;以前没有这方面的需求时可以,但现在需要阻止它切换:
    下面这种情况我是无法阻止它切换的,因为理论上只能各接收到切换前后的通知消息一次
    CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115
     CDeviceManagerView::OnSelChanged treeItem:0, line:143
     CDeviceManagerView::OnSelChanging treeItem:0, line:115
     CDeviceManagerView::OnSelChanged treeItem:74c420, line:143
      

  10.   

    用 OnSelChanging  不行?
    void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    *pResult = 1;
    }
      

  11.   

    可以这样看问题 :
    对于 原 选择 项 
    OnSelchanging 的 (pNMTreeView->itemOld); 说明 要 changing 的 项。void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    CTreeCtrl&  LeftTree=GetTreeCtrl();
    TVITEM *pOld=NULL;
    pOld=&(pNMTreeView->itemOld);
    // Get txt
    CString txt=LeftTree。GetItemText(pOld->hItem);
    if(txt== “你的xxx”)
    {
    *pResult = 1;
    return;// 选择项 不会change 了 !!!!
    }
    *pResult = 0;
    }这样 一来 一旦 进入 “你的xxx” , 就 永远 在 “你的xxx” 里 了。 
      

  12.   

    OnSelChanging可以阻止切换,问题是现在收到了两次TVN_SELCHANGING,是不正确的
      

  13.   

    "问题是现在收到了两次TVN_SELCHANGING,是不正确的"只要 检查 itemOld  !=0 的 那次。
      

  14.   

    “这样 一来 一旦 进入 “你的xxx” , 就 永远 在 “你的xxx” 里 了。 ”可以 附加 检查 VK_CONTROL 键 , 只有按了 VK_CONTROL 键  才能 脱离
     “你的xxx” 
      

  15.   

    感谢你的热心帮助。问题找到原因了,由于在Tree里设置了可以多选,因此在选择新节点时,会先选中NULL来过渡,导致中间
    两次为Item为0。