我在http://www.vckbase.com/document/viewdoc/?id=836下载了一个控件演示的程序,从留言中得知当树控件触发OnItemexpandedTree事件,为其子项添加下一级目录时,会多次为其子项添加下一级目录,自己下载后实验的时候确实是这样,请问各位怎么样才能让其只添加一次?有人说先判断是否添加过,然后在添加或不加.我想是不是可以将添加的删除掉,然后再添加??可惜我刚学,做不到.大家能否给出解决问题的详细代码,谢谢了.
主要代码如下:
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//函数功能:展开事件函数
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void CTreeViewDlg::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
TVITEM item = pNMTreeView->itemNew;
if(item.hItem == m_hRoot)
return;
    HTREEITEM hChild = m_tree.GetChildItem(item.hItem);
while(hChild)
{
AddSubDir(hChild);
hChild = m_tree.GetNextItem(hChild,TVGN_NEXT);
}
*pResult = 0;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//函数功能:获取树项目全跟径
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CString CTreeViewDlg::GetFullPath(HTREEITEM hCurrent)
{
    CString strTemp;
CString strReturn = "";
while(hCurrent != m_hRoot)
{
strTemp = m_tree.GetItemText(hCurrent);
if(strTemp.Right(1) != "\\")
strTemp += "\\";
strReturn = strTemp  + strReturn;
hCurrent = m_tree.GetParentItem(hCurrent);
}
return strReturn;
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//添加子目录
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
void CTreeViewDlg::AddSubDir(HTREEITEM hParent)
{
    CString strPath = GetFullPath(hParent);
if(strPath.Right(1) != "\\")
strPath += "\\";
strPath += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(strPath);
while(bContinue)
{
m_tree.DeleteItem(hParent);
bContinue = file.FindNextFile();
if(file.IsDirectory() && !file.IsDots())
    m_tree.InsertItem(file.GetFileName(),hParent);
}
}

解决方案 »

  1.   

    TVITEM *pNew=NULL;
    char   tvinamenew[MAX_PATH];
    pNew=&(pNMTreeView->itemNew);
    if(pNew && pNew->hItem)
    {
    UINT ret=LeftTree.GetItemState(pNew->hItem,TVIS_EXPANDEDONCE);
    if(ret & TVIS_EXPANDEDONCE) 
    {
    return;// already
    }
    ....
      

  2.   

    谢谢楼上那位大哥,照你的方法解决了,估计是大哥写的比较仓促,把关联的变量写错了,为了以后看帖子的朋友们能看清楚,改一下,将LeftTree改成m_tree.
      

  3.   

    这是我的程序(explorer式分割窗口)中用的,本身不错.我想你能看得懂所以没改.