ctreectrl,CTreeCtrl控件的问题

CTreeCtrl控件的问题 - 故障解答 - 电脑教程网

CTreeCtrl控件的问题

日期:2007-04-18   荐:
CTreeCtrl控件的问题我想在CTreeCtrl控件的项目上加入右键弹出菜单。无论是写NM_RCLICK消息响应函数或定义新类继承CTreeCtrl,再在类里重载OnRButtonDown()效果都不太理想,我想问一下,又没又更好的解决方法?有没有方法可以做出像资源管理器那样的效果?应该响应WM_CONTEXTMENU消息好像运行的结果跟响应WM_MBUTTONUP一样,要点击右键后移动指针再松开,菜单才会弹出来。我刚开始想在WM_RBUTTONDOWN响应函数中实现如果右键点击某项,则选中该项。然后在WM_MBUTTONUP响应函数中弹出菜单,但后来发现点击右键后再松开,响应的不是WM_MBUTTONUP消息。所以移动光标后再松开,菜单才能弹出来。1: ON_NOTIFY(NM_RCLICK, ID_TREECTRL, OnTreeRButtonDown)2: afx_msg void OnTreeRButtonDown(NMHDR* pNMHDR, LRESULT* pResult);3:void CTreeParentWnd::OnTreeRButtonDown(NMHDR* pNMHDR, LRESULT* pResult){ //...}刚开始我就想到直接利用控件的NM_RCLICK消息进行弹出菜单。但是我发现如果在右键点击后,如果移动了鼠标,松开后菜单仍然不会弹出。所以我想到把WM_MBUTTONUP与WM_RBUTTONDOWN分开,无论怎样点击右键,只在响应WM_RBUTTONUP时弹出菜单。但又出现了上述的情况。所以根据罗克的回复我总结了一下:响应WM_RBUTTONDOWN时,进行项目的选择操作,响应WM_RBUTTONUP和NM_RCLICK时分别弹出菜单。因为CTreeCtrl没有WM_RBUTTONUP消息,可以定义新类继承CTreeCtrl,在新类里写WM_RBUTTONUP消息的响应函数,如果菜单的消息响应函数在父窗口则可以使用CWnd* pWnd=GetOwner();pContextMenu->TrackPopupMenu(TPM_LEFTBUTTON, point.x, point.y, pWnd);至此所有的问题就解决了。此方法可解决大多数控件的右键弹出菜单问题,希望有更好的解决方法。所谓举头望明月,低头思故乡。好诗,好诗啊!
标签: