关于MFC中树控件的选中焦点有关问题

关于MFC中树控件的选中焦点问题
假设一个树控件(三层)是这样的

根目录
  子项1
  a
  b
  c
  d
  子项2
  e
  f

而且,我已经实现了右击abcdef才能弹出一个菜单,而右击“子项1”和“子项2”是不会弹出的。

那么现在的问题是,如果我事先左击了“子项1”,然后去直接右击a,这样是不会弹出菜单的,一旦右键弹起,选中状态又恢复到了“子项1”,就好比选中的状态只是暂时转移到了a,也就是如果要直接右击a来弹出菜单,就必须先左击a。
同样,如果事先左击了a,那么再在“子项1”上右击,也能弹出菜单。

我想知道怎么样才能通过右击也把焦点转过来而不要用左击?是不是要修改树的属性什么的?

------解决方案--------------------
在RButtonDown中处理,用HitTest判断是否单击的地方是树节点,如果是的话判断是否是你要弹起菜单的节点,如果是的话,设置SelectItem(),然后弹出菜单,这样应该就OK了.
楼主试试.
------解决方案--------------------
探讨
在RButtonDown中处理,用HitTest判断是否单击的地方是树节点,如果是的话判断是否是你要弹起菜单的节点,如果是的话,设置SelectItem(),然后弹出菜单,这样应该就OK了.
楼主试试.

------解决方案--------------------
给树形控件添加事件处理程序,消息类型为NM_RCLICK,然后再控件中获取选中项(根,子目录均可),设置不同的右击menu,并添加相应的函数就行了,网上例子挺多的
------解决方案--------------------
其实,我觉得改成这样子,应该会可以实现想要的效果:
处理右键的消息:
UINT uFlags;
CPoint point;
::GetCursorPos(&point);
HTREEITEM t=m_tree.GetSelectedItem();//获得选中的项 
if ((hItem != NULL) && (TVHT_ONITEM & uFlags)) 

m_tree.Select(hItem,TVIS_SELECTED); 

if(!m_tree.ItemHasChildren(hItem))//如果没有子项则弹出菜单
{
CMenu m;
m.LoadMenu(IDR_MENU3);
m.GetSubMenu(0)->TrackPopupMenu (TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);
}

------解决方案--------------------
C/C++ code
NM_RCLICK
void CXXXDlg::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: Add your control notification handler code here
    CPoint point;
    GetCursorPos(&point);
    CPoint pt(point);
    m_tree.ScreenToClient(&point);
    HTREEITEM hItem = m_tree.HitTest(point);
    if(hItem)
    {
        m_tree.SelectItem(hItem);

        if(!m_tree.ItemHasChildren(hItem))//如果没有子项则弹出菜单
        {
            CMenu m;
            m.LoadMenu(IDR_MENU3);
            m.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,pt.x,pt.y,this);
            m.DestroyMenu();
        }
    }
    *pResult = 0;
}

------解决方案--------------------
探讨
给树形控件添加事件处理程序,消息类型为NM_RCLICK,然后再控件中获取选中项(根,子目录均可),设置不同的右击menu,并添加相应的函数就行了,网上例子挺多的

------解决方案--------------------
The DestroyMenu function is used, before an application closes, to destroy the menu and free memory that the loaded menu occupied. 
这就跟new和delete类似,不delete也不见得程序会崩溃