CTreeCtrl关于TVN_SELCHANGING和TVN_SELCHANGED的问题 不会 2次 除非 程序 中, 自己 又 SelectItem 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在这个过程当中,我没有操作任何其他界面上的东西,而且处理的时候也没有调用过SelectItem之类的函数 本帖最后由 VisualEleven 于 2014-06-09 22:15:50 编辑 怎么响应 在 void CMainFrame:: 里 ?view 呢? ON_NOTIFY_REFLECT(TVN_SELCHANGING, OnSelchanging)void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here// *pResult = 1; *pResult = 0;} 响应到框架窗口为了方便,因为很多其他的业务也跟Mainfrm有关联。 还是一样的要接受到两次通知。这个是打印跟踪的结果:CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115CDeviceManagerView::OnSelChanging pItemData:3a83808, line:119CDeviceManagerView::OnSelChanged treeItem:0, line:143CDeviceManagerView::OnSelChanging treeItem:0, line:115CDeviceManagerView::OnSelChanged treeItem:74c420, line:143CDeviceManagerView::OnSelChanged pItemData:3a53078, line:147 void CLeftView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) { afxDump << "entry \n"; NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here CMainFrame *pMain=(CMainFrame*)AfxGetMainWnd();// get LeftTree CTreeCtrl& LeftTree=GetTreeCtrl(); TVITEM *pNew=NULL; pNew=&(pNMTreeView->itemNew);// Get tree data if(pNew->hItem) { afxDump << "has new\n"; CShellPidl::LPTVITEMDATA lptvid=(CShellPidl::LPTVITEMDATA)LeftTree.GetItemData(pNew->hItem); // set listview CMyExploreView *pRight=pMain->GetRightPane(); if(lptvid) pRight->PopulateList(lptvid); }// *pResult = 0;}上面的结果是:entry has new 只用if(pNew->hItem)不行吗. 哦,这样只能控制切换后发生的事情;以前没有这方面的需求时可以,但现在需要阻止它切换:下面这种情况我是无法阻止它切换的,因为理论上只能各接收到切换前后的通知消息一次CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115 CDeviceManagerView::OnSelChanged treeItem:0, line:143 CDeviceManagerView::OnSelChanging treeItem:0, line:115 CDeviceManagerView::OnSelChanged treeItem:74c420, line:143 用 OnSelChanging 不行?void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here *pResult = 1;} 可以这样看问题 :对于 原 选择 项 OnSelchanging 的 (pNMTreeView->itemOld); 说明 要 changing 的 项。void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) {NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;// TODO: Add your control notification handler code hereCTreeCtrl& LeftTree=GetTreeCtrl();TVITEM *pOld=NULL;pOld=&(pNMTreeView->itemOld);// Get txtCString txt=LeftTree。GetItemText(pOld->hItem);if(txt== “你的xxx”){*pResult = 1;return;// 选择项 不会change 了 !!!!}*pResult = 0;}这样 一来 一旦 进入 “你的xxx” , 就 永远 在 “你的xxx” 里 了。 OnSelChanging可以阻止切换,问题是现在收到了两次TVN_SELCHANGING,是不正确的 "问题是现在收到了两次TVN_SELCHANGING,是不正确的"只要 检查 itemOld !=0 的 那次。 “这样 一来 一旦 进入 “你的xxx” , 就 永远 在 “你的xxx” 里 了。 ”可以 附加 检查 VK_CONTROL 键 , 只有按了 VK_CONTROL 键 才能 脱离 “你的xxx” 感谢你的热心帮助。问题找到原因了,由于在Tree里设置了可以多选,因此在选择新节点时,会先选中NULL来过渡,导致中间两次为Item为0。 mfc怎么写按钮的消息响应函数,使其被单击时背景色改变,而其文本依然不发生改变? 怎么把文字复制到剪贴板 Accessing an XML Web Service Using C++ 失败如何解决? 如何从导出类导出STL成员? 一个水平滚动字幕类的问题 请教一个关于C++Builder的问题 请问用什么软件可以看出可执行的exe文件是用什么语言编的 菜鸟高分求助:如何整洁、方便的显示数据 求教如何设置编辑框,才能只允许输入数字? 大家好啊。请多关照 求教各位大佬,如何用vc获取计算机加入是否加入域? vc调用delphi的dll 参数传递Pchar 乱码
view 呢?
void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
// *pResult = 1;
*pResult = 0;
}
这个是打印跟踪的结果:
CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115
CDeviceManagerView::OnSelChanging pItemData:3a83808, line:119
CDeviceManagerView::OnSelChanged treeItem:0, line:143
CDeviceManagerView::OnSelChanging treeItem:0, line:115
CDeviceManagerView::OnSelChanged treeItem:74c420, line:143
CDeviceManagerView::OnSelChanged pItemData:3a53078, line:147
{
afxDump << "entry \n";
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame *pMain=(CMainFrame*)AfxGetMainWnd();
// get LeftTree
CTreeCtrl& LeftTree=GetTreeCtrl();
TVITEM *pNew=NULL;
pNew=&(pNMTreeView->itemNew);
// Get tree data
if(pNew->hItem)
{
afxDump << "has new\n";
CShellPidl::LPTVITEMDATA lptvid=(CShellPidl::LPTVITEMDATA)LeftTree.GetItemData(pNew->hItem);
// set listview
CMyExploreView *pRight=pMain->GetRightPane();
if(lptvid) pRight->PopulateList(lptvid);
}
//
*pResult = 0;
}
上面的结果是:entry
has new
if(pNew->hItem)
不行吗
.
下面这种情况我是无法阻止它切换的,因为理论上只能各接收到切换前后的通知消息一次
CDeviceManagerView::OnSelChanging treeItem:75c6b0, line:115
CDeviceManagerView::OnSelChanged treeItem:0, line:143
CDeviceManagerView::OnSelChanging treeItem:0, line:115
CDeviceManagerView::OnSelChanged treeItem:74c420, line:143
void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 1;
}
对于 原 选择 项
OnSelchanging 的 (pNMTreeView->itemOld); 说明 要 changing 的 项。void CLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CTreeCtrl& LeftTree=GetTreeCtrl();
TVITEM *pOld=NULL;
pOld=&(pNMTreeView->itemOld);
// Get txt
CString txt=LeftTree。GetItemText(pOld->hItem);
if(txt== “你的xxx”)
{
*pResult = 1;
return;// 选择项 不会change 了 !!!!
}
*pResult = 0;
}这样 一来 一旦 进入 “你的xxx” , 就 永远 在 “你的xxx” 里 了。
“你的xxx”
两次为Item为0。