⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driveview.cpp

📁 c++系统开发实例精粹内附的80例源代码 环境:windows2000,c++6.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/*
   This following Member Functions were Developed by
   by Nicola Delfino 1999 delfinon@altavista.net
   minor updates carried out by Barretto VN.

   1) AddItem
   2) AddItem_Core
   3) DeleteAllChild
   4) ExpandBranch
   5) GetPathFromHere
   6) RefreshTreeImages
   7) MatchExtension
   8) GetFullPath
   9) SetPath
  10) Dir2Item

*/

HTREEITEM CDriveView::AddItem(const char * path, HTREEITEM parent, bool isDir, int iconEx, int iconEx2 )
{
    SHFILEINFO shinfo, shinfo_sel;

	SHGetFileInfo( path, NULL, 
				   &shinfo, 
				   sizeof(shinfo), 
				   SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON);

	SHGetFileInfo( path, NULL, 
				   &shinfo_sel, 
				   sizeof(shinfo_sel), 
				   SHGFI_DISPLAYNAME |  SHGFI_ICON | SHGFI_OPENICON | SHGFI_SMALLICON);

	int icon    = iconEx!=-1 ? iconEx : m_img.Add(shinfo.hIcon);
    int iconsel = iconEx2!=-1 ? iconEx2 : m_img.Add(shinfo_sel.hIcon);

	m_TreeCtrl.SetImageList (&m_img,LVSIL_NORMAL);
	DeviceName = shinfo.szDisplayName;
	return AddItem_Core ( shinfo.szDisplayName, parent, isDir, icon, iconsel);
}

HTREEITEM CDriveView::AddItem_Core(const char * name, HTREEITEM parent, bool isDir, int icon,int iconOpen)
{
	HTREEITEM hitm;

	hitm=m_TreeCtrl.InsertItem( name, icon, iconOpen, parent);
	if (isDir) m_TreeCtrl.InsertItem( "",hitm);

	return hitm;
}



void CDriveView::DeleteAllChild(HTREEITEM itm, bool isEmpty)
{
	HTREEITEM child;

	child= m_TreeCtrl.GetChildItem(itm);

	while (child)
	{
		int img1, img2;
		
        if (m_TreeCtrl.GetChildItem(child))
            DeleteAllChild(m_TreeCtrl.GetChildItem(child), isEmpty);

        m_TreeCtrl.GetItemImage(child,img1,img2);

        if (img2!=0 && img2!=img1) 
		    {
            m_img.Remove(img2);
            
            RefreshTreeImages(m_drives_root, img2);
            RefreshTreeImages(m_desktop_root, img2);
            }

		if (img1!= 0)
            {
            m_img.Remove(img1);

            RefreshTreeImages(m_drives_root, img1);
            RefreshTreeImages(m_desktop_root, img1);
            }
		
        m_TreeCtrl.DeleteItem (child);

         m_TreeCtrl.SetImageList(&m_img,TVSIL_NORMAL);

		child=  m_TreeCtrl.GetChildItem(itm);
	}

	if (isEmpty)
		 m_TreeCtrl.InsertItem( "",itm); 
}

void CDriveView::ExpandBranch(HTREEITEM parent , CString strPath)
{
    bool bOne=false;

	CMultiDrivesDoc* pDoc = (CMultiDrivesDoc*)GetDocument();

//	if(parent==m_drives_root)
//	{
//		char *ptr;

//    	DeleteAllChild(parent,false);
//		GetLogicalDriveStrings(500,m_drives_name);

//		ptr=m_drives_name;

//		while (*ptr)
//		{
//            bOne=true;
//			AddItem(strPath, parent , true);
//			AddItem(ptr, m_drives_root, true);
//			ptr+=strlen(ptr)+1;
//		}
//	}
//	else
//	{
        CString fullpath,pathWildcard;

//        fullpath=GetPathFromHere(fullpath, parent);
        DeleteAllChild(parent,false);
//        pathWildcard=fullpath+"*.*";
		pathWildcard=strPath+"*.*";

		pDoc->m_FilesView->DeleteAllListItems();

		CFileFind finder;
        BOOL bWorking = finder.FindFile(pathWildcard);
        while (bWorking)
        {
            bWorking = finder.FindNextFile();
            if ( finder.IsDirectory() && !finder.IsDots() )
            {
	            bOne=true;
		        HTREEITEM itm= AddItem (strPath+finder.GetFileName(), parent );
			    m_TreeCtrl.InsertItem("",itm);
            }
			else
			{
				CTime ct;
				finder.GetCreationTime(ct);
				DWORD fs = finder.GetLength();
				CString fn = finder.GetFileName();
				pDoc->m_FilesView->PopulateListView(strPath+finder.GetFileName(), fn , ct , fs);
			}

        }
        
        bWorking = finder.FindFile(pathWildcard);
        while (bWorking)
            {
            bWorking = finder.FindNextFile();
            if ( !finder.IsDirectory() && MatchExtension(finder.GetFileName()) )
                {
                bOne=true;
                 AddItem (fullpath+finder.GetFileName(), parent );
                }
            }

//	}
    
//    if (!bOne)  m_TreeCtrl->InsertItem( "",parent);
}


CString CDriveView::GetPathFromHere(CString s, HTREEITEM itm)
{
    HTREEITEM parent= m_TreeCtrl.GetParentItem(itm);
    HTREEITEM itmChild= m_TreeCtrl.GetChildItem(itm);

//    if (itm==m_drives_root) return "";
        
	if (parent==m_drives_root)
	{
		HTREEITEM child;

		char *ptr=m_drives_name;
		child= m_TreeCtrl.GetChildItem(parent);
		
		while (child)
		{
			if (child==itm)
			{
				s=CString(ptr)+s;
				return s;
			}
			ptr+=strlen(ptr)+1;
			child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
		}
	}
	else if (itm==m_desktop_root)
	{
		s=m_desktop_path+'\\'+s;
		return s;
	}
    else
    {
        if ( m_TreeCtrl.GetItemText(itm)!= CString(""))
            s= m_TreeCtrl.GetItemText(itm)+'\\'+s;

        s=GetPathFromHere(s,parent);
    }


    // remove the last '\' if it isn't a directory
    if (!itmChild && s.GetLength()>0)
        s=s.Left (s.GetLength()-1);

	return s;
}

/* if image number is more than img number -- */
void CDriveView::RefreshTreeImages(HTREEITEM item,int img)
{
    int iStandard, iOpen;
    HTREEITEM itmCurrent;
       
    itmCurrent= m_TreeCtrl.GetChildItem(item);
    
    while (itmCurrent)
        {
        if (m_TreeCtrl.GetItemImage(itmCurrent,iStandard,iOpen))
            {
            if (iStandard>img) iStandard--;
            if (iOpen>img) iOpen--;

            m_TreeCtrl.SetItemImage(itmCurrent,iStandard, iOpen);
            }

        if ( m_TreeCtrl.ItemHasChildren( itmCurrent)!=0)
            {
            RefreshTreeImages(itmCurrent, img);
            }

        itmCurrent= m_TreeCtrl.GetNextSiblingItem(itmCurrent);
        }
}

bool CDriveView::MatchExtension(CString file)
{
    return file.Right(4)==CString(".exe");
}

CString CDriveView::GetFullPath(HTREEITEM item)
{
    if ( m_TreeCtrl.GetItemText(item)==CString("")) return "";
    else return GetPathFromHere("",item);
}

bool CDriveView::SetPath(CString path_in)
{
    char path[MAX_PATH];
    char *delimiters="\\";
    char *token;

    char *pathStart=path;

    HTREEITEM current=m_drives_root;

    strcpy(path,path_in);

    m_TreeCtrl.Expand(current,TVE_EXPAND );
    token=strtok (path,delimiters);
    while (token!=NULL)
        {
        current=Dir2Item(current, token);
        if (!current)
            {
            return false;
            }
        
         m_TreeCtrl.Expand(current,TVE_EXPAND );
        token=strtok(NULL,delimiters);
        }

    m_TreeCtrl.SelectItem(current);
    return true;
}

HTREEITEM CDriveView::Dir2Item(HTREEITEM current, char *dir)
{
    if (current==m_drives_root)
        {
        HTREEITEM child;
        CString szDir(dir);

        szDir+="\\";
        szDir.MakeUpper();

		char *ptr=m_drives_name;
		child= m_TreeCtrl.GetChildItem(current);
		
		while (child)
		    {
			if (szDir==CString(ptr))
		    	{
				return child;
			    }
			ptr+=strlen(ptr)+1;
			child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
		    }
        }
    else
        {
        HTREEITEM child;
        CString szChildText;
        CString szDir(dir);

        szDir.MakeUpper();

		child= m_TreeCtrl.GetChildItem(current);
		while (child)
		    {
            szChildText= m_TreeCtrl.GetItemText(child);
            szChildText.MakeUpper();

			if ( szChildText==szDir)
		    	{
				return child;
			    }
			child= m_TreeCtrl.GetNextItem(child, TVGN_NEXT);
		    }
        }

    return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -