我使用CTreeCtrl MFC类创建树控制对象。树控件需要支持重命名。 当我左键单击Tree中的任何项目时,将调用TVN_SELCHANGED事件,我可以从中获取树的选定项目,如下所示: HTREEITEM h = m_moveListTree.GetSelectedItem(); CString s = m_moveListTree.GetItemText(h);
然而,当我右键单击树中的任何项目时,我没有得到任何TVN_SELCHANGED事件,因此我选择的项目仍然与左击事件保持相同。这导致以下问题: 1)用户左键单击项目A. 2)用户右键单击项目B并说明重命名 3)由于所选项目仍然是A,重命名正在申请项目A.
请帮助解决问题。
-Praveen
答案 0 :(得分:2)
此行为是设计使然 - 右键单击不会移动选择。
根据您的需要,在树形视图中打开TVS_EDITLABELS样式。然后你处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT通知。
答案 1 :(得分:0)
我在Win32 API之上创建了自己的MFC,就像本土的C ++ GUI库一样,查看我的代码,这就是它处理这种情况的方法:
LRESULT xTreeCtrl::onRightClick(NMHDR *)
{
xPoint pt;
//-- get the cursor at the time the mesage was posted
DWORD dwPos = ::GetMessagePos();
pt.x = GET_X_LPARAM(dwPos);
pt.y = GET_Y_LPARAM (dwPos);
//-- now convert to window co-ordinates
pt.toWindow(this);
//-- check for a hit
HTREEITEM hItem = this->hitTest(pt);
//-- select any item that was hit
if ((int)hItem != -1) this->select(hItem);
//-- leave the rest to default processing
return 0;
}
我怀疑你是否在MFC右键单击或右键按下事件中做了类似的事情来解决问题。
注意:上面的onRightClick代码只不过是 WM_NOTIFY , NM_RCLICK 消息的处理程序。
答案 2 :(得分:0)
不确定如何弹出上下文菜单,但可以使用HitTest()从一个点到树项。因此,您可以在右键单击处理程序中使用它。
不要忘记,上下文菜单也可以通过合理的现代键盘上的按键激活。然后,您可能希望将所选项目用作目标。