void CTreeListView::OnClickTreeList(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
CAddEditDelDlg AddEditDelDlg; HTREEITEM hItem=m_TreeList.GetSelectedItem(); if(hItem != NULL && m_TreeList.ItemHasChildren(hItem) == NULL  )
{
if( hItem == hAddEditDel)
{
AddEditDelDlg.DoModal();
}
}
*pResult = 0;
}我在2个if语句上加上断点,调试发现,我点击鼠标第一下时,并没有进入下面的if语句,点击第二下时才进入。然后我再点击别的选项,他还是会出现那个对话框,点击第二下时他才没有出现。这也就是说他延迟了一下。请问原因何在?应该怎么改进?谢谢!

解决方案 »

  1.   

    把  hAddEditDel 取值部分的代码贴一下,估计是这个地方有问题。  贴出来帮你看下!
      

  2.   

    ON_NOTIFY(TVN_SELCHANGED, OnSelchanged)你应该相应TVN_SELCHANGED消息.试试
      

  3.   


    void CTreeListView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
    {
    // TODO: Add your specialized code here and/or call the base class
    HTREEITEM hPrep,hSubPrep, hSubElem;
    //Preprocessor
    hPrep = m_TreeList.InsertItem("Preprocessor",TVI_ROOT);
    hSubPrep = m_TreeList.InsertItem("Element Type",hPrep);
    hAddEditDel = m_TreeList.InsertItem("Add/Edit/Delete",hSubPrep);
            hSubElem = m_TreeList.InsertItem("Switch Elem Type",hSubPrep,hSubElem);
    }
    这是添加树形节点的代码。hAddEditDel我定义的是public成员变量。难道这个地方有问题?希望帮我看看。不好意思隔了这么长时间,双休有点别的事要做,就没上网站看了。
      

  4.   

    会不会是这样的原因?我在响应NM_CLICK消息时,虽然用了GetSelectedItem(),但是NM_CLICK比TVN_SELCHANGED先处理,也就是说取到的值仍然是点击鼠标前的取值。这样刚好解释为什么延迟一步了。那么怎么解决这个问题呢?
      

  5.   

    void CtestDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
     // TODO: Add your control notification handler code here
     *pResult = 0;
     DWORD   dwpos = GetMessagePos();   
     TVHITTESTINFO ht = {0};    ht.pt.x = GET_X_LPARAM(dwpos);
     ht.pt.y = GET_Y_LPARAM(dwpos);
     ::MapWindowPoints(HWND_DESKTOP,pNMHDR->hwndFrom,&ht.pt,1); //把屏幕坐标转换成控件坐标 TreeView_HitTest(pNMHDR->hwndFrom,&ht);   //确定点击的是哪一项 MessageBox(mTree.GetItemText(ht.hItem));} 包含头文件 "windowsx.h" 通过上面的代码;就在树形控件的单击确定选中当前项;
      

  6.   

    你这个问题出在
    HTREEITEM hItem=m_TreeList.GetSelectedItem();
    这一句
    第一下选中了以后,你点第二下,才会进入if语句,逻辑应该是这样吧?
    所以我觉得你获取item的方法可以换一下,用HitTest()这个函数看看.
      

  7.   

    谢谢5楼,按照你的方法,问题得到解决。但是我有点不明白GetSelectedItem()这个函数不是获取当前选中节点的句柄吗?为什么会出现我所说的那种问题呢?而一定要用坐标的方法来获取句柄呢?
      

  8.   

    单击树形控件的过程中并没有立刻选择当前项; 单击的当前项并没有被选中。
    所以通过GetSelectedItem()选择的是前一个的项
      

  9.   

    哦,那是不是说NM_CLICK比TVN_SELCHANGED先响应?那么我在响应NM_CLICK消息时调用TVN_SELCHANGED消息的处理可不可以?还请教你一个问题,就是弹出对话框后,该节点没有选中的标志,关闭对话框才出现选中的标志。我用SetItemState()函数不起作用,有什么方法能够解决呢?