建立檔案夾瀏覽器

來源:互聯網
上載者:User
 

一 執行個體 二 思路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; 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.