速进::有关 树视控件 查找节点、指向路径问题!请高人指点!不胜感激!

郑沐洋 2014-02-17 01:34:43
我在利用树形控件编写资源管理器。
遇到问题如下:
如何获取E盘根目录的节点。目标路径就是“E盘根目录”,我怎么把路径转化成树形控件的节点。
如图:现在已有的资源管理器界面,如下:

现在的根节点,是指向桌面的,我想改成指向E盘根目录。运行如下图:

以上,是我的问题。初始化函数代码如下:
void DirTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeCtrl &Tree=GetTreeCtrl();

LPSHELLFOLDER lpsf=NULL; //IShellFolder接口
LPITEMIDLIST lpi=NULL; //ITERMIDLSIT结构体指针
HRESULT hr;
TV_ITEM tvi;

CImageList m_Image;//记录的是与树型控件关联的图像列表
SHFILEINFO sfi;//存放文件信息的结构
HIMAGELIST sys_small_icon;
sys_small_icon = (HIMAGELIST)SHGetFileInfo(NULL,0,&sfi,sizeof(sfi),
SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
m_Image.Attach(sys_small_icon);
Tree.SetImageList(&m_Image,TVSIL_NORMAL);//将系统图像列表设为树控件的图象列表
m_Image.Detach ();

// 得到指向“桌面”的指针
hr=SHGetDesktopFolder(&lpsf);
SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&lpi);

if (SUCCEEDED(hr))
{
Tree.DeleteAllItems();

char szBuff[MAX_PATH];//存放显示名称的缓冲区
TV_INSERTSTRUCT tvis; //向树型控件中插入节点时使用的结构

tvi.mask = TVIF_TEXT | TVIF_IMAGE |
TVIF_SELECTEDIMAGE | TVIF_CHILDREN ; //设置要插入的树节点信息
if(GetName(lpsf,lpi,SHGDN_NORMAL,szBuff)==FALSE)
return;
tvi.pszText = szBuff;//设置显示名称

GetNormalAndSelectedIcons(lpi, &tvi);
tvis.item = tvi;
tvis.hParent = TVI_ROOT;

hParent = GetTreeCtrl().InsertItem(&tvis);//插入根节点
// HTREEITEM hNext = GetTreeCtrl().GetNextItem(hParent,TVGN_NEXTVISIBLE);
// HTREEITEM hChild = GetTreeCtrl().GetNextItem(hNext,TVGN_NEXT);
// HTREEITEM hNext1 = GetTreeCtrl().GetNextItem(hNext1,TVGN_NEXT);
FillTreeView(lpsf, NULL, hParent);
GetTreeCtrl().Expand (hParent,TVE_EXPAND);//展开“桌面”节点
lpsf->Release ();
}
}
...全文
443 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-02-18
  • 打赏
  • 举报
回复
在“计算机”下 吧 ? 那就要 展开 “计算机”后才能 看到 E: 看看 你的 Expend 代码。
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:

void CLeftView::FillTreeView(LPSHELLFOLDER lpsf,LPITEMIDLIST lpifq,HTREEITEM hParent)
{
TV_ITEM tvi; // TreeView Item.
TV_INSERTSTRUCT tvins; // TreeView Insert Struct.
HTREEITEM hPrev = NULL;
HTREEITEM hItemEdrive=0;
LPSHELLFOLDER lpsf2=NULL;
LPENUMIDLIST lpe=NULL;
LPITEMIDLIST lpi=NULL, lpiTemp=NULL, lpifqThisItem=NULL;
LPTVITEMDATA lptvid=NULL;
LPMALLOC lpMalloc=NULL;
ULONG ulFetched;
UINT uCount=0;
HRESULT hr;
char szBuff[256];
HWND hwnd=::GetParent(m_hWnd);
CTreeCtrl &Tree=GetTreeCtrl();

// Allocate a shell memory object.
hr=::SHGetMalloc(&lpMalloc);
if (FAILED(hr))
return;

if (SUCCEEDED(hr))
{
// Get the IEnumIDList object for the given folder.
hr=lpsf->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe);

if (SUCCEEDED(hr))
{
// Enumerate throught the list of folder and non-folder objects.
while (S_OK==lpe->Next(1, &lpi, &ulFetched))
{
//Create a fully qualified path to the current item
//The SH* shell api's take a fully qualified path pidl,
//(see GetIcon above where I call SHGetFileInfo) whereas the
//interface methods take a relative path pidl.
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;

// Determine what type of object we have.
lpsf->GetAttributesOf(1, (const struct _ITEMIDLIST **)&lpi, &ulAttrs);

if (ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
{
//We need this next if statement so that we don't add things like
//the MSN to our tree. MSN is not a folder, but according to the
//shell it has subfolders.
if (ulAttrs & SFGAO_FOLDER)
{
tvi.mask= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

if (ulAttrs & SFGAO_HASSUBFOLDER)
{
//This item has sub-folders, so let's put the + in the TreeView.
//The first time the user clicks on the item, we'll populate the
//sub-folders.
tvi.cChildren=1;
tvi.mask |= TVIF_CHILDREN;
}

//OK, let's get some memory for our ITEMDATA struct
lptvid = (LPTVITEMDATA)lpMalloc->Alloc(sizeof(TVITEMDATA));
if (!lptvid)
goto Done; // Error - could not allocate memory.

//Now get the friendly name that we'll put in the treeview.
if (!GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
goto Done; // Error - could not get friendly name.
tvi.pszText = szBuff;
tvi.cchTextMax = MAX_PATH;

lpifqThisItem=ConcatPidls(lpifq, lpi);

//Now, make a copy of the ITEMIDLIST
lptvid->lpi=CopyITEMID(lpMalloc, lpi);

GetNormalAndSelectedIcons(lpifqThisItem, &tvi);

lptvid->lpsfParent=lpsf; //Store the parent folders SF
lpsf->AddRef();

lptvid->lpifq=ConcatPidls(lpifq, lpi);

tvi.lParam = (LPARAM)lptvid;

// Populate the TreeVeiw Insert Struct
// The item is the one filled above.
// Insert it after the last item inserted at this level.
// And indicate this is a root entry.
tvins.item = tvi;
tvins.hInsertAfter = hPrev;
tvins.hParent = hParent;

// Add the item to the tree
hPrev = Tree.InsertItem(&tvins);
if(strstr(szBuff,"E:") && !strchr(szBuff,'\\'))
{
hItemEdrive=hPrev;
}
}
// Free this items task allocator.
lpMalloc->Free(lpifqThisItem);
lpifqThisItem=0;
}

lpMalloc->Free(lpi); //Free the pidl that the shell gave us.
lpi=0;
}
}

}
else
return;

Done:

if (lpe)
lpe->Release();

//The following 2 if statements will only be TRUE if we got here on an
//error condition from the "goto" statement. Otherwise, we free this memory
//at the end of the while loop above.
if (lpi && lpMalloc)
lpMalloc->Free(lpi);
if (lpifqThisItem && lpMalloc)
lpMalloc->Free(lpifqThisItem);

if (lpMalloc)
lpMalloc->Release();
}


注意:if(strstr(szBuff,"E:") && !strchr(szBuff,'\\'))
{
hItemEdrive=hPrev;// 这个就是要返回的
}
首先,感谢老师孜孜不倦的教我,然后,我把这句话加上去后,设置断点执行时发现,本程序初始化,是遍历不到E盘的节点的,如图,只遍历了如上节点,所以,这句话被直接跳过了,“hItemEdrive=hPrev;// 这个就是要返回的”没有被执行,怎么办呢?
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
首先,感谢老师孜孜不倦的教我,然后,我把这句话加上去后,设置断点执行时发现,本程序初始化,是遍历不到E盘的节点的,如图,只遍历了如上节点,所以,这句话被直接跳过了,“hItemEdrive=hPrev;// 这个就是要返回的”没有被执行,怎么办呢?
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 20 楼 schlafenhamster 的回复:
上面的办法不好。 我给你写了一段:放在: lpsf->Release (); } 后,FillTreeView 就不用改了(改 回去)。 CTreeCtrl &Tree=GetTreeCtrl(); #if 1 HTREEITEM hChild=Tree.GetChildItem(hParent);//hParent=桌面 CString str=Tree.GetItemText(hChild); while(str != "计算机") {// 查找 '计算机' hChild=Tree.GetNextSiblingItem(hChild); str=Tree.GetItemText(hChild); afxDump << str << "\n"; } // 找到 “计算机”, 展开他 Tree.Expand(hChild,TVE_EXPAND); // 再找 ’E:" HTREEITEM hEdrive=Tree.GetChildItem(hChild);// hChild="计算机" str=Tree.GetItemText(hEdrive); while(str.Find("E:") < 0) {// 查找 'E:' hEdrive=Tree.GetNextSiblingItem(hEdrive); str=Tree.GetItemText(hEdrive); afxDump << str << "\n"; } // 找到 “E:” Tree.Expand(hEdrive,TVE_EXPAND); Tree.Select(hEdrive,TVGN_FIRSTVISIBLE); #endif
谢谢老师。谢谢老师,回去去我一定好好学习,加深理解,升职加薪,有机会请您吃饭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
schlafenhamster 2014-02-18
  • 打赏
  • 举报
回复
上面的办法不好。 我给你写了一段:放在: lpsf->Release (); } 后,FillTreeView 就不用改了(改 回去)。 CTreeCtrl &Tree=GetTreeCtrl(); #if 1 HTREEITEM hChild=Tree.GetChildItem(hParent);//hParent=桌面 CString str=Tree.GetItemText(hChild); while(str != "计算机") {// 查找 '计算机' hChild=Tree.GetNextSiblingItem(hChild); str=Tree.GetItemText(hChild); afxDump << str << "\n"; } // 找到 “计算机”, 展开他 Tree.Expand(hChild,TVE_EXPAND); // 再找 ’E:" HTREEITEM hEdrive=Tree.GetChildItem(hChild);// hChild="计算机" str=Tree.GetItemText(hEdrive); while(str.Find("E:") < 0) {// 查找 'E:' hEdrive=Tree.GetNextSiblingItem(hEdrive); str=Tree.GetItemText(hEdrive); afxDump << str << "\n"; } // 找到 “E:” Tree.Expand(hEdrive,TVE_EXPAND); Tree.Select(hEdrive,TVGN_FIRSTVISIBLE); #endif
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
那就先展开 ‘计算机’
hParent = GetTreeCtrl().InsertItem(&tvis);//插入根节点
h_计算机=FillTreeView(lpsf, NULL, hParent);
GetTreeCtrl().Expand (hParent,TVE_EXPAND);//展开“桌面”节点
在 FillTreeView 里 先查 ‘计算机’即:
if(strcmp(szBuff,"计算机")==0)
{
h_计算机=hPrev;
}
然后再展开 ‘计算机’

经过如上修改,,改成如上图所示了!
schlafenhamster 2014-02-18
  • 打赏
  • 举报
回复
“'=' : cannot convert from 'void' to 'struct _TREEITEM *'”, 求解释! 叫你把 void FillTreeView() 改 HTREEITEM FillTreeView() 你没改。 hItemEdrive=hPrev;// 这个就是要返回的 即 return hItemEdrive;
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
那就先展开 ‘计算机’ hParent = GetTreeCtrl().InsertItem(&tvis);//插入根节点 h_计算机=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hParent,TVE_EXPAND);//展开“桌面”节点 在 FillTreeView 里 先查 ‘计算机’即: if(strcmp(szBuff,"计算机")==0) { h_计算机=hPrev; } 然后再展开 ‘计算机’
HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent);这句代码也是运行不成功的,“'=' : cannot convert from 'void' to 'struct _TREEITEM *'”, 求解释!
schlafenhamster 2014-02-18
  • 打赏
  • 举报
回复
那就先展开 ‘计算机’ hParent = GetTreeCtrl().InsertItem(&tvis);//插入根节点 h_计算机=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hParent,TVE_EXPAND);//展开“桌面”节点 在 FillTreeView 里 先查 ‘计算机’即: if(strcmp(szBuff,"计算机")==0) { h_计算机=hPrev; } 然后再展开 ‘计算机’
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
让 FillTreeView(lpsf, NULL, hParent); 返回 E:盘 的 hItemEdrive 即: HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hItemEdrive,TVE_EXPAND);//展开“E:”节点 至于 hItemEdrive 就是 name=“E:” 的item
HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent);这句代码也是运行不成功的,“'=' : cannot convert from 'void' to 'struct _TREEITEM *'”, 求解释!
郑沐洋 2014-02-18
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
在“计算机”下 吧 ? 那就要 展开 “计算机”后才能 看到 E:
看看 你的 Expend 代码。
void DirTreeView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	LPTVITEMDATA   lptvid;  
	HRESULT        hr;
	LPSHELLFOLDER  lpsf=NULL;
	
    if ((pNMTreeView->itemNew.state & TVIS_EXPANDEDONCE))
         return;
		
    lptvid=(LPTVITEMDATA)pNMTreeView->itemNew.lParam;
    if (lptvid)
	{
		hr=lptvid->lpsfParent->BindToObject(lptvid->lpi,
                0, IID_IShellFolder,(LPVOID *)&lpsf);
		
		if (SUCCEEDED(hr))
		{
			FillTreeView(lpsf,lptvid->lpifq,pNMTreeView->itemNew.hItem);
		}         
    }
	*pResult = 0;
}
schlafenhamster 2014-02-17
  • 打赏
  • 举报
回复

void CLeftView::FillTreeView(LPSHELLFOLDER lpsf,LPITEMIDLIST lpifq,HTREEITEM hParent)
{
    TV_ITEM         tvi;                          // TreeView Item.
    TV_INSERTSTRUCT tvins;                        // TreeView Insert Struct.
    HTREEITEM       hPrev = NULL;
	HTREEITEM       hItemEdrive=0;
    LPSHELLFOLDER   lpsf2=NULL;
    LPENUMIDLIST    lpe=NULL;
    LPITEMIDLIST    lpi=NULL, lpiTemp=NULL, lpifqThisItem=NULL;
    LPTVITEMDATA    lptvid=NULL;
    LPMALLOC        lpMalloc=NULL;
    ULONG           ulFetched;
    UINT            uCount=0;
    HRESULT         hr;
    char            szBuff[256];
    HWND            hwnd=::GetParent(m_hWnd);
	CTreeCtrl      &Tree=GetTreeCtrl();   

    // Allocate a shell memory object. 
    hr=::SHGetMalloc(&lpMalloc);
    if (FAILED(hr))
       return;

    if (SUCCEEDED(hr))
    {
        // Get the IEnumIDList object for the given folder.
        hr=lpsf->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe);

        if (SUCCEEDED(hr))
        {
            // Enumerate throught the list of folder and non-folder objects.
            while (S_OK==lpe->Next(1, &lpi, &ulFetched))
            {
                //Create a fully qualified path to the current item
                //The SH* shell api's take a fully qualified path pidl,
                //(see GetIcon above where I call SHGetFileInfo) whereas the
                //interface methods take a relative path pidl.
                ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;

                // Determine what type of object we have.
                lpsf->GetAttributesOf(1, (const struct _ITEMIDLIST **)&lpi, &ulAttrs);

                if (ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
                {
                   //We need this next if statement so that we don't add things like
                   //the MSN to our tree.  MSN is not a folder, but according to the
                   //shell it has subfolders.
                   if (ulAttrs & SFGAO_FOLDER)
                   {
                      tvi.mask= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;

                      if (ulAttrs & SFGAO_HASSUBFOLDER)
                      {
                         //This item has sub-folders, so let's put the + in the TreeView.
                         //The first time the user clicks on the item, we'll populate the
                         //sub-folders.
                         tvi.cChildren=1;
                         tvi.mask |= TVIF_CHILDREN;
                      }
                        
                      //OK, let's get some memory for our ITEMDATA struct
                      lptvid = (LPTVITEMDATA)lpMalloc->Alloc(sizeof(TVITEMDATA));
                      if (!lptvid)
                         goto Done;  // Error - could not allocate memory.
   
                      //Now get the friendly name that we'll put in the treeview.
                      if (!GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
                         goto Done; // Error - could not get friendly name.
                      tvi.pszText    = szBuff;
                      tvi.cchTextMax = MAX_PATH;
    
                      lpifqThisItem=ConcatPidls(lpifq, lpi);
      
                      //Now, make a copy of the ITEMIDLIST
                      lptvid->lpi=CopyITEMID(lpMalloc, lpi);
   
                      GetNormalAndSelectedIcons(lpifqThisItem, &tvi);
   
                      lptvid->lpsfParent=lpsf;    //Store the parent folders SF
                      lpsf->AddRef();

                      lptvid->lpifq=ConcatPidls(lpifq, lpi);
   
                      tvi.lParam = (LPARAM)lptvid;
   
                      // Populate the TreeVeiw Insert Struct
                      // The item is the one filled above.
                      // Insert it after the last item inserted at this level.
                      // And indicate this is a root entry.
                      tvins.item         = tvi;
                      tvins.hInsertAfter = hPrev;
                      tvins.hParent      = hParent;
   
                      // Add the item to the tree
                      hPrev = Tree.InsertItem(&tvins);
if(strstr(szBuff,"E:") && !strchr(szBuff,'\\'))
{
	hItemEdrive=hPrev;
}
                   }
                   // Free this items task allocator.
                   lpMalloc->Free(lpifqThisItem);  
                   lpifqThisItem=0;
                }

                lpMalloc->Free(lpi);  //Free the pidl that the shell gave us.
                lpi=0;
            }
        }

    }
    else
       return;

Done:
 
    if (lpe)  
        lpe->Release();

    //The following 2 if statements will only be TRUE if we got here on an
    //error condition from the "goto" statement.  Otherwise, we free this memory
    //at the end of the while loop above.
    if (lpi && lpMalloc)           
        lpMalloc->Free(lpi);
    if (lpifqThisItem && lpMalloc) 
        lpMalloc->Free(lpifqThisItem);  

    if (lpMalloc) 
        lpMalloc->Release();
}
注意:if(strstr(szBuff,"E:") && !strchr(szBuff,'\\')) { hItemEdrive=hPrev;// 这个就是要返回的 }
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
看看 你的 FillTreeView(lpsf, NULL, hParent);
//树控件节点展开时,加入各个子节点的名称及图标
void DirTreeView::FillTreeView(LPSHELLFOLDER lpsf, LPITEMIDLIST  lpifq, HTREEITEM  hParent)
{
    TV_ITEM         tvi;                          // TreeView Item.
    TV_INSERTSTRUCT tvins;                        // TreeView Insert Struct.
    HTREEITEM       hPrev = NULL;                 // Previous Item Added.//
    LPENUMIDLIST    lpe=NULL;
    LPITEMIDLIST    lpi=NULL, lpiTemp=NULL, lpifqThisItem=NULL;
    LPTVITEMDATA    lptvid=NULL;
    LPMALLOC        lpMalloc=NULL;
    ULONG           ulFetched;
    HRESULT         hr;
    char            szBuff[256];
  
	HWND            hwnd=::GetParent(m_hWnd);
	//分配一个shell内存对象
    hr=::SHGetMalloc(&lpMalloc);
    if (FAILED(hr))
       return;

	//如果成功地分配了空间
    if (SUCCEEDED(hr))
    {
        hr=lpsf->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &lpe);
        if (SUCCEEDED(hr))
        {
            //枚举出其中的文件夹
            while (S_OK==lpe->Next(1, &lpi, &ulFetched))
            {
                ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
				lpsf->GetAttributesOf(1, (LPCITEMIDLIST*) &lpi, &ulAttrs);
				if (ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
				{
                	 tvi.mask= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
					 //如果有子文件夹
					 if (ulAttrs & SFGAO_HASSUBFOLDER)
					 {
                        tvi.cChildren=1;
						tvi.mask |= TVIF_CHILDREN;
					 }
                     lptvid = (LPTVITEMDATA)lpMalloc->Alloc(sizeof(TVITEMDATA));

                     if (!lptvid)
                        goto Done;                         
                     if (!GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
                        goto Done; 					  				
					 
					 //所插入项的名称
                     tvi.pszText    = szBuff;

                     lpifqThisItem=ConcatPidls(lpifq, lpi);
					 
					 lptvid->lpi=(LPITEMIDLIST)lpMalloc->
						 Alloc(lpi->mkid.cb+sizeof(lpi->mkid.cb));

                     CopyMemory((PVOID)lptvid->lpi, (CONST VOID *)lpi, 
						 lpi->mkid.cb+sizeof(lpi->mkid.cb));
					 
                     GetNormalAndSelectedIcons(lpifqThisItem, &tvi);					
   
                     lptvid->lpsfParent=lpsf;
                     lptvid->lpifq=ConcatPidls(lpifq, lpi);

                     tvi.lParam = (LPARAM)lptvid;
                  	 tvins.item         = tvi;
                     tvins.hInsertAfter = hPrev;
                     tvins.hParent      = hParent;
					 
					 //插入树的节点
					 hPrev = GetTreeCtrl().InsertItem(&tvins);						  
				 }	
				lpMalloc->Free(lpifqThisItem);  
				lpifqThisItem=0;
			}
			lpMalloc->Free(lpi); 
			return;
		}			        
    }
    else
       return;
Done: 
    if (lpe)  
        lpe->Release();
    if (lpi && lpMalloc)           
        lpMalloc->Free(lpi);
    if (lpifqThisItem && lpMalloc) 
        lpMalloc->Free(lpifqThisItem);  
    if (lpMalloc) 
        lpMalloc->Release();
}
schlafenhamster 2014-02-17
  • 打赏
  • 举报
回复
看看 你的 FillTreeView(lpsf, NULL, hParent);
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
快来人呗!!!!!!!!!!
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
让 FillTreeView(lpsf, NULL, hParent); 返回 E:盘 的 hItemEdrive 即: HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hItemEdrive,TVE_EXPAND);//展开“E:”节点 至于 hItemEdrive 就是 name=“E:” 的item
hItemEdrive 就是 name=“E:” 的item——————关键就是怎么实现这一步????????????
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
引用 4 楼 schlafenhamster 的回复:
让 FillTreeView(lpsf, NULL, hParent); 返回 E:盘 的 hItemEdrive 即: HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hItemEdrive,TVE_EXPAND);//展开“E:”节点 至于 hItemEdrive 就是 name=“E:” 的item
可以加下QQ说么?
schlafenhamster 2014-02-17
  • 打赏
  • 举报
回复
让 FillTreeView(lpsf, NULL, hParent); 返回 E:盘 的 hItemEdrive 即: HTREEITEM hItemEdrive=FillTreeView(lpsf, NULL, hParent); GetTreeCtrl().Expand (hItemEdrive,TVE_EXPAND);//展开“E:”节点 至于 hItemEdrive 就是 name=“E:” 的item
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
问了几次了, 莫非是 ‘答非所问’ ?
帮帮我吧,一个问题都好几天了!纠结死!
郑沐洋 2014-02-17
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
问了几次了, 莫非是 ‘答非所问’ ?
问题我还是没有解决,您可以在我代码上改一改吗?现在不要获取路径,直接初始化到E盘根目录,E盘根目路的那个节点,我找不到,所以不知道从何下手,您可以在我代码上改一改吗
加载更多回复(1)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧