1

我有使用 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。

请帮助解决问题。

-普拉文

4

3 回答 3

2

此行为是设计使然——右键单击不会移动选择。

For what you want, turn on the TVS_EDITLABELS style on the tree view. Then you handle the TVN_BEGINLABELEDIT and TVN_ENDLABELEDIT notifications.

于 2008-09-18T07:49:12.200 回答
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_NOTIFYNM_RCLICK消息的处理程序。

于 2008-09-18T07:46:33.440 回答
0

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

不要忘记上下文菜单也可以通过合理的现代键盘上的键来激活。然后您可能希望将所选项目用作目标。

于 2008-09-18T07:47:25.090 回答