假设一个树控件(三层)是这样的根目录
子项1
a
b
c
d
子项2
e
f而且,我已经实现了右击abcdef才能弹出一个菜单,而右击“子项1”和“子项2”是不会弹出的。那么现在的问题是,如果我事先左击了“子项1”,然后去直接右击a,这样是不会弹出菜单的,一旦右键弹起,选中状态又恢复到了“子项1”,就好比选中的状态只是暂时转移到了a,也就是如果要直接右击a来弹出菜单,就必须先左击a。
同样,如果事先左击了a,那么再在“子项1”上右击,也能弹出菜单。我想知道怎么样才能通过右击也把焦点转过来而不要用左击?是不是要修改树的属性什么的?
子项1
a
b
c
d
子项2
e
f而且,我已经实现了右击abcdef才能弹出一个菜单,而右击“子项1”和“子项2”是不会弹出的。那么现在的问题是,如果我事先左击了“子项1”,然后去直接右击a,这样是不会弹出菜单的,一旦右键弹起,选中状态又恢复到了“子项1”,就好比选中的状态只是暂时转移到了a,也就是如果要直接右击a来弹出菜单,就必须先左击a。
同样,如果事先左击了a,那么再在“子项1”上右击,也能弹出菜单。我想知道怎么样才能通过右击也把焦点转过来而不要用左击?是不是要修改树的属性什么的?
楼主试试.
CPoint point;
::GetCursorPos(&point);
HTREEITEM t=m_tree.GetSelectedItem();//获得选中的项
HTREEITEM hItem = m_tree.HitTest(point, &uFlags);
if ((hItem != NULL) && (TVHT_ONITEM & uFlags))
{
m_tree.Select(hItem, TVGN_CARET);
} // CString s1=m_tree.GetItemText(hItem);
// CString s2=m_tree.GetItemText(t);
// CString s=s1+":"+s2;
// MessageBox(s);//经测试,s1永远是空的,而s2则能正确获得选择项的文本
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);
}我这么写的话,不管怎么样,都没有菜单弹出
HTREEITEM t=m_tree.GetSelectedItem();//获得选中的项
这样获得的“选中项”也是根据鼠标左击来定的,而不是右击
求解啊为什么我3楼的做法,不管怎么样,都没有菜单弹出
处理右键的消息:
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);
}
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;
}
不过我还想问下,你代码里面最后那句m.DestroyMenu();我没有加好像也没什么问题。那么加上是为了更严谨么?
这就跟new和delete类似,不delete也不见得程序会崩溃