一 執行個體 二 思路1 GetLocalDeviceString 可獲得當前電腦的盤符,即c:d:e:,盤符之間以’/0’相隔。2 GetFileAttributes 用來判斷是否檔案夾。dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&strcmp(cFileName,".")!=0&&strcmp(cFileName,"..")!=0 即表示該檔案為檔案夾。3 FindFirstFile 尋找指定路徑的第一個檔案。4 FindNextFile 尋找下一個檔案。5 hTreeItem=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_PARENT , (LPARAM)tvi.hItem); 擷取當前結點的父結點,用以獲得所選擇結點的路徑。6 hTreeItem=(HTREEITEM)SendMessage(hwTree,TVM_GETNEXTITEM,TVGN_CHILD , (LPARAM)hTItem); 擷取當前結點目錄的子檔案,用以擷取第一個子目錄。7 hTreeItem=(HTREEITEM)SendMessage(hwTree,TVM_GETNEXTITEM,TVGN_NEXT , (LPARAM)hTItem); 擷取當前結點的下一個結點,用以列出子目錄。8 思路描述由於遍曆電腦的所有檔案夾既浪費時間,影響效能,也沒必要。我們只需展示目前的目錄的所有子目錄,而子目錄只需用+來表示是否包有子目錄,而+只要檢測到該目錄包有一個子目錄即可。所以只需搜尋當前層和下一層的第一個檔案夾即可。每次展開一個檔案夾之後,下次就不需再檢測了,因而效能相對來說好多了。第一次顯示,只搜尋第一個檔案夾,使其有+或-;當點擊該目錄時,搜尋目前的目錄的子目錄,若搜尋到第一個子目錄,則用+表示。如何對所選擇檔案夾進行展開?① 選取目前的目錄;② 對該目錄按上面規則展開。展開全部和展開局部:展開全部指展開目前的目錄的所有子目錄;展開局部指展開目前的目錄的一兩個子目錄。當點擊某個目錄時,然後展開目前的目錄的全部和展開所有子目錄的局部。如何對已存在的目錄不再展開?如果已存在的項<=2,則刪除已開啟,再展開全部;否則不處理。三 代碼////folder.h///////#include <windows.h>#include <commctrl.h>#include <stdio.h>#include "resource.h" #pragma comment(lib,"comctl32.lib") int InitTreeView(HWND hwndTree,HINSTANCE hInstance);int FindDir(HTREEITEM hTItem,char dir[]);int ExpandAll(HTREEITEM hTItem,char dir[]);int IsItemExist(HTREEITEM hTItem,char dir[]); /////folder.cpp/////////#include "folder.h" HWND hwTree;HTREEITEM hTreeItem[10]; /*樹形列表名稱:InitTreeView功能:初始化樹形控制項參數:hwndTree 為樹形清單控制項控制代碼,hInstance為程式控制代碼*/int InitTreeView(HWND hwndTree,HINSTANCE hInstance){ int tx=0,i,len; char Driver[50],p[20],dir[200]; TV_INSERTSTRUCT tvs; TV_ITEM tvi; hwTree=hwndTree; HIMAGELIST himgl; himgl=ImageList_Create(16,16,ILC_COLOR16,1,10); i=ImageList_AddIcon(himgl,LoadIcon(hInstance,(LPCTSTR)IDI_FCLOSE)); i=ImageList_AddIcon(himgl,LoadIcon(hInstance,(LPCTSTR)IDI_FIXED)); i=ImageList_AddIcon(himgl,LoadIcon(hInstance,(LPCTSTR)IDI_COMPUTER)); i=ImageList_AddIcon(himgl,LoadIcon(hInstance,(LPCTSTR)IDI_FOPEN)); himgl=TreeView_SetImageList(hwndTree,himgl,TVSIL_NORMAL); tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvi.pszText ="我的電腦"; tvi.iImage=2; tvi.iSelectedImage=2; tvs.hInsertAfter=TVI_LAST; tvs.hParent=TVI_ROOT; tvs.item =tvi; hTreeItem[0]=TreeView_InsertItem(hwndTree,&tvs); ///////以下為分為盤符C:D:等的功能//////////// GetLogicalDriveStrings(50,Driver); i=0; while(1) { len=strlen(&Driver[i]); if(len==0) break; sprintf(dir,"%s*",&Driver[i]); Driver[i+len-1]='/0'; sprintf(p,"%s",&Driver[i]); tx=0; tvs.hParent=hTreeItem[tx]; tvi.pszText=p; tvi.cchTextMax=strlen(tvi.pszText); tvi.iImage=1; tvi.iSelectedImage=1; tvs.item=tvi; tx++; hTreeItem[tx]=TreeView_InsertItem(hwndTree,&tvs); FindDir(hTreeItem[tx],dir); i+=len+1; } SendMessage(hwndTree,TVM_EXPAND,TVE_EXPAND|TVE_EXPANDPARTIAL,(LPARAM)hTreeItem[0]); return 1;}/*名稱:FinDir 功能:展開局部,即展為子目錄的第一個或第二個目錄 參數:hTItem目前的目錄的控制代碼,dir 目前的目錄的路徑*/int FindDir(HTREEITEM hTItem,char dir[]){ TV_INSERTSTRUCT tvs; TV_ITEM tvi; WIN32_FIND_DATA fdata; HANDLE hF=NULL; tvs.hParent=hTItem; hF=FindFirstFile (dir,&fdata); if (hF == INVALID_HANDLE_VALUE) { FindClose(hF); return 0; } else if(fdata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&strcmp(fdata.cFileName,".")!=0&&strcmp(fdata.cFileName,"..")!=0) { tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvs.hInsertAfter=TVI_LAST; tvi.pszText=fdata.cFileName; tvi.cchTextMax=strlen(tvi.pszText); tvi.iImage=0; tvi.iSelectedImage=3; tvs.item=tvi; TreeView_InsertItem(hwTree,&tvs); } while(FindNextFile(hF,&fdata)!=0) { if(fdata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&strcmp(fdata.cFileName,".")!=0&&strcmp(fdata.cFileName,"..")!=0) { tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvs.hInsertAfter=TVI_LAST; tvi.pszText=fdata.cFileName; tvi.cchTextMax=strlen(tvi.pszText); tvi.iImage=0; tvi.iSelectedImage=3; tvs.item=tvi; TreeView_InsertItem(hwTree,&tvs); break; } } FindClose(hF); return 1;}/*名稱:ExpandAll 功能:展開全部,展開當前的所有子目錄 參數:hTItem目前的目錄控制代碼,dir為目前的目錄的路徑*/int ExpandAll(HTREEITEM hTItem,char dir[]){ char path[200]; TV_INSERTSTRUCT tvs; TV_ITEM tvi; WIN32_FIND_DATA fdata; HANDLE hF=NULL; HTREEITEM hexpanitem; tvs.hParent=hTItem; sprintf(path,"%s//*",dir); hF=FindFirstFile (path,&fdata); if (hF == INVALID_HANDLE_VALUE) { FindClose(hF); return 0; } else if(fdata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&strcmp(fdata.cFileName,".")!=0&&strcmp(fdata.cFileName,"..")!=0) { tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvs.hInsertAfter=TVI_LAST; tvi.pszText=fdata.cFileName; tvi.cchTextMax=strlen(tvi.pszText); tvi.iImage=0; tvi.iSelectedImage=3; tvs.item=tvi; hexpanitem=TreeView_InsertItem(hwTree,&tvs); sprintf(path,"%s//%s//*",dir,fdata.cFileName); FindDir(hexpanitem,path); } while(FindNextFile(hF,&fdata)!=0) { if(fdata.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY&&strcmp(fdata.cFileName,".")!=0&&strcmp(fdata.cFileName,"..")!=0) { tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvs.hInsertAfter=TVI_LAST; tvi.pszText=fdata.cFileName; tvi.cchTextMax=strlen(tvi.pszText); tvi.iImage=0; tvi.iSelectedImage=3; tvs.item=tvi; hexpanitem=TreeView_InsertItem(hwTree,&tvs); sprintf(path,"%s//%s//*",dir,fdata.cFileName); FindDir(hexpanitem,path); } } FindClose(hF); return 1;}/*名稱:IsItemExist 功能:判斷目前的目錄是否已全部展開,用以判斷若是展開則不必再展開全部 參數:hTItem為目前的目錄控制代碼,dir為目前的目錄的路徑*/int IsItemExist(HTREEITEM hTItem,char dir[]){ HTREEITEM hTreeItemtemp; int count; hTreeItemtemp=(HTREEITEM)SendMessage(hwTree,TVM_GETNEXTITEM,TVGN_CHILD,(LPARAM)hTItem); if(hTreeItemtemp==NULL) return 0; hTItem=hTreeItemtemp; count=1; while(1) { hTreeItemtemp=(HTREEITEM)SendMessage(hwTree,TVM_GETNEXTITEM,TVGN_NEXT,(LPARAM)hTItem); if(hTreeItemtemp==NULL) break; hTItem=hTreeItemtemp; count++; if(count>=3) return 1; } while(1) { hTreeItemtemp=(HTREEITEM)SendMessage(hwTree,TVM_GETNEXTITEM,TVGN_PREVIOUS,(LPARAM)hTItem); SendMessage(hwTree,TVM_DELETEITEM,0,(LPARAM)hTItem); if(hTreeItemtemp==NULL) return 0; hTItem=hTreeItemtemp; } return 1;} /////main.cpp///////HWND hTree;LPNM_TREEVIEW pnmtv; char buff[50];char buffPath[MAX_PATH],tempPath[MAX_PATH];TV_ITEM tvi;HTREEITEM hTreeItemtemp;case WM_NOTIFY: pnmtv=(NM_TREEVIEW FAR *)lParam; if(pnmtv->hdr.code==TVN_SELCHANGED||pnmtv->hdr.code==TVN_ITEMEXPANDING) { tvi.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT; tvi.hItem=pnmtv->itemNew.hItem; tvi.pszText=buff; tvi.cchTextMax=50; hTree=GetDlgItem(hDlg,ID_TREE_FOLDER); SendMessage(hTree,TVM_GETITEM,0,(LPARAM)(TV_ITEM FAR*)&tvi); if(strcmp(buff,"我的電腦")==0) return 0; sprintf(buffPath,"%s",buff); strcpy(tempPath,buffPath); while(1) { hTreeItemtemp=(HTREEITEM)SendMessage(hTree,TVM_GETNEXTITEM,TVGN_PARENT,(LPARAM)tvi.hItem); tvi.mask=TVIF_TEXT; tvi.hItem=hTreeItemtemp; tvi.pszText=buff; tvi.cchTextMax=50; SendMessage(hTree,TVM_GETITEM,0,(LPARAM)(TV_ITEM FAR*)&tvi); if(strcmp(buff,"我的電腦")==0) break; sprintf(buffPath,"%s//%s",buff,tempPath); strcpy(tempPath,buffPath); } SetDlgItemText(hDlg,ID_SRCPATH,buffPath); if(!IsItemExist(pnmtv->itemNew.hItem,buffPath)) ExpandAll(pnmtv->itemNew.hItem,buffPath); }
break;