Visual c++ CTreeCtrl对象上的TVN_SELCHANGED出现问题

Visual c++ CTreeCtrl对象上的TVN_SELCHANGED出现问题,visual-c++,mfc,treeview,Visual C++,Mfc,Treeview,我使用CTreeCtrl MFC类创建了树控件对象。树控件需要支持重命名。 当我左键单击树中的任何项目时,将调用TVN_SELCHANGED事件,从中我可以获得树中的选定项目,如下所示: HTREEITEM h=m_moveListTree.GetSelectedItem(); CString s=m_moveListTree.GetItemText(h) 但是,当我右键单击树中的任何项目时,我不会得到任何TVN_SELCHANGED事件,因此我所选的项目仍然与左键单击事件保持相同。这会导致以下

我使用CTreeCtrl MFC类创建了树控件对象。树控件需要支持重命名。 当我左键单击树中的任何项目时,将调用TVN_SELCHANGED事件,从中我可以获得树中的选定项目,如下所示: HTREEITEM h=m_moveListTree.GetSelectedItem(); CString s=m_moveListTree.GetItemText(h)

但是,当我右键单击树中的任何项目时,我不会得到任何TVN_SELCHANGED事件,因此我所选的项目仍然与左键单击事件保持相同。这会导致以下问题: 1) 用户左键单击项目A 2) 用户右键单击项目B并显示重命名 3) 由于所选项目仍然是A,因此重命名将应用于项目A

请帮忙解决这个问题


Praveen

< P>我在Win32 API上创建了自己的MFC类的国产C++图形库,并查看了我的代码,这就是它如何处理:

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\u NOTIFY,NM\u RCLICK消息的处理程序。

不确定如何弹出上下文菜单,但您可以使用HitTest()从一个点到树项。因此,您可以在右键单击处理程序中使用它


不要忘记,快捷菜单也可以通过现代键盘上的一个键激活。然后,您可能希望使用所选项目作为目标。

此行为是经过设计的——右键单击不会移动所选内容


根据需要,在树状视图上启用TVS_EDITLABELS样式。然后处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT通知。

您好,谢谢您的回复。在哪里可以找到xPoint类?或者如何将oiint从CPoint类转换为窗口坐标必须使用CPoint,然后调用ScreenToClient()。嗨,克里斯,谢谢你的回复。在得到CPoint pt:LPPOINT p=new tagPOINT之后,我就这样编码了;p->x=pt.x;p->y=pt.y;筛选客户(p);pt.x=p->x;p.y=p->y;HTREEITEM hItem=m_moveListTree.HitTest(pt);但所指的项目是错误的。我该怎么办?对不起,Praveen,应该是m_moveListTree.ScreenToClient。另外,请注意,您不需要使用运算符new分配标记点对象。只需做:CPoint pt;第x部分=。。。;pt.y=。。。;m_moveListTree.ScreenToClient(pt);