程序使用FormView分成左(LEFT),中(MIDDLE)两块区域。
左边是树(Tree),中间根据左边点击的选项显示不同的图片,或加载控件显示曲线、播放flash等。
现在为左边的树响应了右键菜单响应的消息函数,以及切换选择项的消息函数:
ON_NOTIFY(TVN_SELCHANGED,IDC_TREE_CATALOG,OnTreeSelChanged)
ON_NOTIFY(NM_RCLICK,IDC_TREE_CATALOG,OnNMRclickTree1)右键消息弹出菜单,并同时选择选中新节点,就是说那个节点同时被选上了。这样在我右键点击的时候,同时响应了以上两个函数,即弹出菜单,又在MIDDLE里跟新显示界面。结果问题就出在这里了,连续右键不同节点时,前面一个右键菜单的消失的比较慢,留下了残影。如果屏蔽TVN_SELCHANGED消息,则就不会有这样的问题,同时我在右键菜单函数或OnTreeSelChanged中UpdateData或InvalidDate都解决不了问题,
我又试过创建一个线程,将OnTreeSelChanged里的函数单独封在里面,企图通过sleep线程让右键菜单先响应结束再进行MIDDLE界面的更新,但很惊奇遗憾地发现之前一个右键菜单的残影一定会在MIDDLE界面更新完之后才消失。我想这是问题的关键所在,想请教大家该如何解决这个菜单残影问题,是否有Windows函数可以在程序里先行对被摧毁的修菜单区域进行更新消除残影,使残影不会在我MIDDLE区域更新完之后在消失?希望大家多帮我看看,非常感谢了

解决方案 »

  1.   

    屏蔽TVN_SELCHANGED消息,则就不会有这样的问题
    --------
    你可以屏蔽了这个消息,没有必要一定要有这个消息啊 ~~你选中一项可以通过右键消息来实现
      

  2.   

    void CXXXXDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        CPoint pt;
        UINT flag; 
        HTREEITEM hCurrentItem;       
        GetCursorPos(&pt); 
        m_tree.ScreenToClient(&pt); 
        hCurrentItem = m_tree.HitTest(pt, &flag);
        m_tree.SelectItem(hCurrentItem);
    }
      

  3.   


    TVN_SELCHANGED消息中有进行对MIDDLE界面的更新显示的操作,我如果把它屏蔽了,那他里面更新MIDDLE的操作也要再得放到右键菜单和左键点击里面来了。同时,放到右键菜单里面来因为MIDDLE区域仍然要更新所以仍在存在着MIDDLE先更新完了 再 右键菜单残影消失的情况。
    而这我已经验证过了,我试过将这更新MIDDLE的操作放在这右键菜单消息函数里面过,仍存在问题
      

  4.   


    我又试了一遍,发现UpdateWindow也不行,估计跟InvalidDate差不多
      

  5.   

    话说LZ你有没有调用DestroyMenu来删除你上次加载的菜单~~
      

  6.   

    //右键菜单消息
    void CCatalogDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
                    m_popMenu = new CMenu;
    m_popMenu->LoadMenu(IDR_MENU_CATALOG);
    CMenu *pSub = m_popMenu->GetSubMenu(0);
    if(pSub)
                    {
                     .........
            CPoint pt;
    ::GetCursorPos(&pt);
    pSub->TrackPopupMenu(TPM_CENTERALIGN,pt.x+55,pt.y,this);
    }
    Invalidate(FALSE);
    }//树节点切换消息
    void CCatalogDlg::OnTreeSelChanged(NMHDR* pNMHDR, LRESULT* pResult) 
    {
            .................
            //获得MIDDLE视图的指针(自定义函数)
             CMiddleFormView *pMiddle = GetSpecialWnd(GetFrm(),CMiddleFormView,IDD_FORMVIEW_MIDDLE);
    if(pMiddle != NULL)
    {
                    ..................
                    //向MIDDLE视图发消息以使它根据左边节点选择的变化而进行更新显示。
    pMiddle ->SendMessage(WM_BOTTOM_INFO,flag,catalogID);
    }
    }