关于树控件的几个问题

时间:2022-03-20 18:04:18
1、要实现的功能:单击某一项,在一个编辑框里显示该项的全路径。
   存在的问题:每次显示的都是上次选中项的全路径。
   双击节点或单击节点前的加号都可以正确显示,不知道单击是怎么回事。

2、要实现的功能:单击某一项,改变它的图标。
   

17 个解决方案

#1


不能使用单击事件的参数来判断点中哪一个节点。可以在单击事件中用HitTest来判断选中哪一个节点。
单击一项,改变图标,你的难处在哪里?不是用ImageList嘛

#2


在TreeView的TVN_SELCHANGED里面处理

void CEditTreeCtrl::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TVITEM item = pNMTreeView->itemNew;

//here is your code to update the edit caption
*pResult = 0;
}

2、用SetItemImage(htiSon, 0, 1);设置两幅不同地图片就行了
   

#3


1.处理CTreeCtrl的nm_click事件,hittest,然后getitemtext即可得到正确的路径
2.使用CTreeCtrl::SetItem

#4


CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);

HTREEITEM hItem = HitTest(pt);

#5


1。
void CTest6Dlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

         CPoint pt;
         GetCursorPos(&pt);
         ScreenToClient(&pt);

         HTREEITEM hItem = m_tree.HitTest(pt);
         
          //显示路径

*pResult = 0;
}


2。

TV_ITEM* pItem;
pItem.hItem = hItem;
pItem.iSelectedImage = ??;
pItem.iImage = ??;

.....
m_tree.SetItem(pItem);

#6


又来晚了-_-b 楼主响应的消息错了吧应该响应NM_CLICK消息

  然后就是上面的hittest了

#7


同意楼上的兄弟们的说法,你做的时候多参考一下MSDN

#8


多谢各位的热心 我一直不太清楚nImage 和nSelectedImage有什么不同,我用的时候都给它俩设相同的值 这会有什么隐患 还望指点

#9


iSelectedImage  在被选择状态显示的图标index
iImage          在未被选择状态显示的图标index

#10


void CMainDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
CPoint pt;
    GetCursorPos(&pt);
ScreenToClient(&pt);

HTREEITEM hItem = m_tree.HitTest(pt);

CString str;
str.Format("%s",m_tree.GetItemText(hItem));
AfxMessageBox(str);

*pResult = 0;
}

还是不行,连字符都没有了

#11


1、void CTest6Dlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

         CPoint pt;
         GetCursorPos(&pt);
         ScreenToClient(&pt);

         HTREEITEM hItem = m_tree.HitTest(pt);
         
          //得到该项的全路径 
          //显示路径

*pResult = 0;
}
结果显示的不是上次选中项的路径了,而是位于选中项的下面项的下面的那一项的路径
譬如:(在树中的上下位置)a节点下面是b节点,再下面是c节点,选a则显示c的全路径
会是怎么回事呢

#12


iSelectedImage  在被选择状态显示的图标index
iImage          在未被选择状态显示的图标index
本来我还根据其不同状态自己去设置呢 真是绕了一个大圈子
多谢小三!!也怪我问题问得不清!
第一个问题出现的现象太怪异了 望各路高手指点。群策群力!!先行多谢了!!

#13


第一个问题有了两种解决方法:
1〉在小三的程序中再加一句 pt.y -= 40;不知道这样做会不会有什么隐患 更不知道为什么不减不行
2〉用xdljf(hunter)的方法,不过函数体中的句子有点小错误,应该改为
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TV_ITEM Temp;
Temp = pNMTreeView->itemNew;
TVITEM item = expanditem.hItem;

#14


给你发了短消息了, 你试试

#15


小三给出的解决方法是将ScreenToClient(&pt); 改为m_tree.ScreenToClient(&pt);不用减40了!!
这种方法还存在一个小问题:程序执行后第一次单击无效;将某个文件夹打开后单击其子文件夹,第一次单击操作无效,显示的还是原来的路径。

xdljf(hunter)的方法存在的小问题是:
将某个文件夹打开后单击其子文件夹,第一次单击的子文件夹无效,不论单击多少次,再单击其他子文件夹显示的路径就是正确的,回头单击“第一次文件夹”也是正确的。

问题比较奇怪,哪为遇到过?SOS……

#16


请问有两棵同样的树,单击其中一棵,另一棵也随着变化,怎样实现

#17


这两种解决方法是没问题的,问题是我加的限制语句造成的!!
在TreeView的TVN_SELCHANGED里面处理效果更好一些 
多谢各位的热心相助!!!僧多粥少,就看着给了 抱歉 !!
xingbin666(xingbin666)  不好意思,我要结帖了

#1


不能使用单击事件的参数来判断点中哪一个节点。可以在单击事件中用HitTest来判断选中哪一个节点。
单击一项,改变图标,你的难处在哪里?不是用ImageList嘛

#2


在TreeView的TVN_SELCHANGED里面处理

void CEditTreeCtrl::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TVITEM item = pNMTreeView->itemNew;

//here is your code to update the edit caption
*pResult = 0;
}

2、用SetItemImage(htiSon, 0, 1);设置两幅不同地图片就行了
   

#3


1.处理CTreeCtrl的nm_click事件,hittest,然后getitemtext即可得到正确的路径
2.使用CTreeCtrl::SetItem

#4


CPoint pt;
GetCursorPos(&pt);
ScreenToClient(&pt);

HTREEITEM hItem = HitTest(pt);

#5


1。
void CTest6Dlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

         CPoint pt;
         GetCursorPos(&pt);
         ScreenToClient(&pt);

         HTREEITEM hItem = m_tree.HitTest(pt);
         
          //显示路径

*pResult = 0;
}


2。

TV_ITEM* pItem;
pItem.hItem = hItem;
pItem.iSelectedImage = ??;
pItem.iImage = ??;

.....
m_tree.SetItem(pItem);

#6


又来晚了-_-b 楼主响应的消息错了吧应该响应NM_CLICK消息

  然后就是上面的hittest了

#7


同意楼上的兄弟们的说法,你做的时候多参考一下MSDN

#8


多谢各位的热心 我一直不太清楚nImage 和nSelectedImage有什么不同,我用的时候都给它俩设相同的值 这会有什么隐患 还望指点

#9


iSelectedImage  在被选择状态显示的图标index
iImage          在未被选择状态显示的图标index

#10


void CMainDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
CPoint pt;
    GetCursorPos(&pt);
ScreenToClient(&pt);

HTREEITEM hItem = m_tree.HitTest(pt);

CString str;
str.Format("%s",m_tree.GetItemText(hItem));
AfxMessageBox(str);

*pResult = 0;
}

还是不行,连字符都没有了

#11


1、void CTest6Dlg::OnClickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

         CPoint pt;
         GetCursorPos(&pt);
         ScreenToClient(&pt);

         HTREEITEM hItem = m_tree.HitTest(pt);
         
          //得到该项的全路径 
          //显示路径

*pResult = 0;
}
结果显示的不是上次选中项的路径了,而是位于选中项的下面项的下面的那一项的路径
譬如:(在树中的上下位置)a节点下面是b节点,再下面是c节点,选a则显示c的全路径
会是怎么回事呢

#12


iSelectedImage  在被选择状态显示的图标index
iImage          在未被选择状态显示的图标index
本来我还根据其不同状态自己去设置呢 真是绕了一个大圈子
多谢小三!!也怪我问题问得不清!
第一个问题出现的现象太怪异了 望各路高手指点。群策群力!!先行多谢了!!

#13


第一个问题有了两种解决方法:
1〉在小三的程序中再加一句 pt.y -= 40;不知道这样做会不会有什么隐患 更不知道为什么不减不行
2〉用xdljf(hunter)的方法,不过函数体中的句子有点小错误,应该改为
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
TV_ITEM Temp;
Temp = pNMTreeView->itemNew;
TVITEM item = expanditem.hItem;

#14


给你发了短消息了, 你试试

#15


小三给出的解决方法是将ScreenToClient(&pt); 改为m_tree.ScreenToClient(&pt);不用减40了!!
这种方法还存在一个小问题:程序执行后第一次单击无效;将某个文件夹打开后单击其子文件夹,第一次单击操作无效,显示的还是原来的路径。

xdljf(hunter)的方法存在的小问题是:
将某个文件夹打开后单击其子文件夹,第一次单击的子文件夹无效,不论单击多少次,再单击其他子文件夹显示的路径就是正确的,回头单击“第一次文件夹”也是正确的。

问题比较奇怪,哪为遇到过?SOS……

#16


请问有两棵同样的树,单击其中一棵,另一棵也随着变化,怎样实现

#17


这两种解决方法是没问题的,问题是我加的限制语句造成的!!
在TreeView的TVN_SELCHANGED里面处理效果更好一些 
多谢各位的热心相助!!!僧多粥少,就看着给了 抱歉 !!
xingbin666(xingbin666)  不好意思,我要结帖了