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

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

请帮助解决问题。

-普雷文

有帮助吗?

解决方案

我在 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_通知, NM_RCLICK 信息。

其他提示

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

对于您想要的内容,请在树视图上打开 TVS_EDITLABELS 样式。然后,您处理 TVN_BEGINLABELEDIT 和 TVN_ENDLABELEDIT 通知。

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

不要忘记,上下文菜单也可以通过合理的现代键盘上的按键激活。那么您可能想使用所选项目作为目标。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top