我在对话框的初始化函数里给树控件所有项加了图标1,当选择改变时,变成图标2,我想选中下一个时,上一个被选中的恢复图标1,但是出现了问题,所有被选过的全都保持图标2,怎么办呢?
void CManMeasure::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
  
    m_imagelist.Create (IDB_TREEIMAGE,20,2,ILC_COLOR8);
    m_Tree.SetImageList (&m_imagelist,TVSIL_NORMAL); 
   
    HTREEITEM hItem,hSubItem;
    hItem = m_Tree.InsertItem("sss",0,1,TVI_ROOT); 
    hItem = m_Tree.InsertItem("ddd",0,1,TVI_ROOT,hItem); 
}
void CManMeasure::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
hTreeCurrent=m_Tree.GetSelectedItem ();
m_Tree.SetItemImage(hTreeCurrent,1,true );
*pResult = 0;
}

解决方案 »

  1.   

    你现在响应的消息是TVN_SELCHANGED,这个是转换后的消息,得到当前Item也是转换后的。还有一个消息是TVN_SELCHANGING,看一下吧!
      

  2.   


    创建一个ImageList 
    HICON hicon[2];
    CWinApp *pApp = AfxGetApp();
    hicon[0] = pApp->LoadIcon(IDI_ICON1);
    hicon[1] = pApp->LoadIcon(IDI_ICON2); if(!ImageList.Create(16,16,ILC_COLOR32,2,0))
    {
    TRACE("Failed to create Image list");
    return;
    } m_imageList.SetBkColor(RGB(128,128,128)); for(int i = 0; i < 2; i++)
    ImageList.Add(hicon[i]); m_ctlTree.SetImageList(&ImageList,TVSIL_NORMAL);添加树节点
    ctlTree.InsertItem("Root", 1, 0, TVI_ROOT);  //选中显ICON1
      

  3.   

    可以在添加节点时设置选中图标的索引 (int nSelectedImage)
      

  4.   

    你添加一个HTREEITEM m_treeitem用来保存上一次选择时的item
    你在OnSelchangedTree里面就处理上一次选择的item与当前选择的item
      

  5.   


    m_ImageList.Create(16,16,ILC_COLOR32,2,2);
    m_ImageList.Add(theApp.LoadIcon(IDI_ICON1));
    m_ImageList.Add(theApp.LoadIcon(IDI_ICON2));
    m_TreeCtrl.SetImageList(&m_ImageList,TVSIL_NORMAL);  //设置图象列表HTREEITEM hItem,hSubItem; TV_INSERTSTRUCT TCItem; //插入数据项数据结构 
    TCItem.hParent = TVI_ROOT; //增加根项 
    TCItem.hInsertAfter = TVI_LAST; //在最后项之后 
    TCItem.item.mask = TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
    TCItem.item.pszText = LPSTR(LPCTSTR("sss")); 
    TCItem.item.iImage = 0; //正常图标 
    TCItem.item.iSelectedImage = 1; //选中时图标hItem = m_Tree.InsertItem(&TCItem); TCItem.hParent = hItem ;
    TCItem.item.pszText = LPSTR(LPCTSTR("ddd"));
    hSubItem= m_Tree.InsertItem(&TCItem);
      

  6.   

    首先 3 4 6 楼都正确。其次:
    你看看下面的你就明白了。CTreeCtrl::InsertItemHTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
    HTREEITEM InsertItem( UINT nMask,
                          LPCTSTR lpszItem,
                          int nImage,
                          int nSelectedImage,
                          UINT nState,
                          UINT nStateMask,
                          LPARAM lParam,
                          HTREEITEM hParent,
                          HTREEITEM hInsertAfter
                         );HTREEITEM InsertItem( LPCTSTR lpszItem,
                          HTREEITEM hParent = TVI_ROOT,
                          HTREEITEM hInsertAfter = TVI_LAST
                         );HTREEITEM InsertItem( LPCTSTR lpszItem,
                          int nImage,
                          int nSelectedImage,
                          HTREEITEM hParent = TVI_ROOT,
                          HTREEITEM hInsertAfter = TVI_LAST
                         );返回值:如果成功则返回新项的句柄;否则返回NULL。参数: lpInsertStruct 一个指向用来指定要插入的tree view项的属性的TVINSERTSTRUCT的指针。  
    nMask 用来指定要设置的属性的整数。  
    lpszItem 一个包含项的文本的字符串的地址。  
    nImage 项的图像在tree view控件的图像列表中的索引。  
    nSelectedImage 项的被选择图像在tree view控件的图像列表中的索引。  
    nState 为项的状态指定的值。  
    nStateMask 指定要设置的状态。  
    lParam 与此项关联的一个32位的应用程序指定的值。  
    hParent 要被插入的项的父项的句柄。  
    hInsertAfter 新项要被插入其后的项的句柄。  说明:
    此成员函数用来在一个tree view控件中插入一个新项。