CTreeCtrl对象上的TVN_SELCHANGED问题
时间:2020-03-06 14:20:17 来源:igfitidea点击:
我有使用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_NOTIFY,NM_RCLICK消息的处理程序。
不确定如何弹出上下文菜单,但是可以使用HitTest()从点到树项目。因此,我们可以在右键单击处理程序中使用它。
不要忘记,上下文菜单也可以通过合理的现代键盘上的按键来激活。然后,我们可能希望将所选项目用作目标。
此行为是设计使然-右键单击不会移动选择。
根据需要,在树状视图上打开TVS_EDITLABELS样式。然后,我们将处理TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT通知。