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

📄 getdirectory.cpp

📁 mytoolpad 源码
💻 CPP
字号:
#include "stdafx.h"
#include "MyToolPad.h"
#include "GetDirectory.h"
#include "io.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CString m_directory;


CGetDirectory::CGetDirectory(CWnd* pParent /*=NULL*/)
	: CDialog(CGetDirectory::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGetDirectory)
	m_dirname = _T("");
	//}}AFX_DATA_INIT
}


void CGetDirectory::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGetDirectory)
	DDX_Control(pDX, IDC_DIRTREE, m_tree);
	DDX_Text(pDX, IDC_DIRNAME, m_dirname);
	DDV_MaxChars(pDX, m_dirname, 250);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGetDirectory, CDialog)
	//{{AFX_MSG_MAP(CGetDirectory)
	ON_NOTIFY(NM_DBLCLK, IDC_DIRTREE, OnDblclkDirtree)
	ON_NOTIFY(TVN_ITEMEXPANDING, IDC_DIRTREE, OnItemexpandingDirtree)
	ON_NOTIFY(TVN_SELCHANGED, IDC_DIRTREE, OnSelchangedDirtree)
	ON_NOTIFY(TVN_ITEMEXPANDED, IDC_DIRTREE, OnItemexpandedDirtree)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


BOOL CGetDirectory::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_dirname=m_directory;
	AllDiskToTree();
	UpdateData(FALSE);
	
	return TRUE;
}

void CGetDirectory::OnOK() 
{
	UpdateData(TRUE);
	m_directory=m_dirname;
	CDialog::OnOK();
}

//获取某个节点的全名
CString CGetDirectory::GetFullName(HTREEITEM root)
{
	CString ret=m_tree.GetItemText(root);
	CString itemname,temp;
	HTREEITEM parent=m_tree.GetParentItem(root);
	while(parent)
	{
		itemname=m_tree.GetItemText(parent);
		parent=m_tree.GetParentItem(parent);
		temp=ret;
		ret=itemname+_T("\\")+temp;
	}
	if(ret.GetLength()<10)
		return ret;
	char *pt=(char *)(strstr(ret,"(")+1);
	itemname.Format("%c:",pt[0]);
	itemname+=_T(&pt[3]);
	return itemname;
}

//将整个机器所有盘体加入树中
void CGetDirectory::AllDiskToTree()
{
	char diskname[80];
	
	CBitmap bitmap;
	imagelist.Create(16,16,TRUE,2,5);
	bitmap.LoadBitmap(IDB_CLOSEFOLD);
	imagelist.Add(&bitmap,(COLORREF)0xFFFFFF);
	bitmap.DeleteObject();
	bitmap.LoadBitmap(IDB_OPENFOLD);
	imagelist.Add(&bitmap,(COLORREF)0xFFFFFF);
	bitmap.DeleteObject();
	m_tree.SetImageList(&imagelist,TVSIL_NORMAL);

	HTREEITEM hRoot,hCur,First=NULL;
	hRoot=CreateTree("我的电脑");
	for(int i=0;i<26;i++)
	{
		wsprintf(diskname,"%c:\\",'A'+i);
		if(GetDriveType(diskname)==DRIVE_FIXED)
		{
			long param=0;
			SetHiword(param,0);
			SetLoword(param,GetChildDirNumber(diskname));
			wsprintf(diskname,"%s (%c:)",GetDiskVolumnName('A'+i),'A'+i);
			hCur=InsertTreeItem(diskname,param,hRoot,0);
			InsertTreeItem("暂时目录",param,hCur,0);
			if(!First)
				First=hCur;
		}
	}
	m_tree.Expand(m_tree.GetRootItem(),TVE_EXPAND);
	m_tree.SelectItem(First);
}

void CGetDirectory::DirToTree(CString dirname,HTREEITEM root)
{
	DirToTree(dirname.GetBuffer(dirname.GetLength()),root);
}
//当前目录的子树到树中
void CGetDirectory::DirToTree(char *dirname,HTREEITEM root)
{			
	DWORD data=m_tree.GetItemData(root);
	if(LOWORD(data)==0)//低字为子树数目
		return;
	if(HIWORD(data)!=0)//高字为1表示已经列入子目录
		return;
	
	DeleteAllChild(root);
	SetItemHighParam(root,1);

	char Searchname[200],buffer[250];
	int  ret=0;
	wsprintf(Searchname,"%s\\%s",dirname,"*.*");
	struct _finddata_t fileinfo;
	long handle=_findfirst(Searchname,&fileinfo);
	while((handle>0) && (ret==0))
	{			
		if(fileinfo.attrib & _A_SUBDIR)
		{
			if((strcmpi(fileinfo.name,".")!=0) && (strcmpi(fileinfo.name,"..")!=0) && (strcmpi(fileinfo.name,"RECYCLED")!=0))
			{
				wsprintf(buffer,"%s\\%s",dirname,fileinfo.name);
				long attr=0;
				int number=GetChildDirNumber(buffer);
				SetHiword(attr,0);
				SetLoword(attr,number);
				HTREEITEM hCur=InsertTreeItem(fileinfo.name,attr,root,0);
				if(number>0)
				{
					InsertTreeItem("暂时目录",attr,hCur,0);
					SetItemHighParam(hCur,0);
				}
			}
		}
		ret=_findnext(handle,&fileinfo);
	}
}

void CGetDirectory::SetItemHighParam(HTREEITEM cur,WORD high)
{
	DWORD ret=m_tree.GetItemData(cur);
	DWORD temp=(DWORD)high;
	temp<<=16;
	ret&=0x0000ffff;
	ret|=temp;
	m_tree.SetItemData(cur,ret);
}


/*********************/
//返回磁盘卷标名称
char *CGetDirectory::GetDiskVolumnName(char disk)
{
	char  RootPathName[100]="g:\\";
	RootPathName[0]=disk;
	char  VolumeNameBuffer[200];
	DWORD nVolumeNameSize=200;
	DWORD VolumeSerialNumber;
	DWORD MaximumComponentLength;
	DWORD FileSystemFlags=FS_FILE_COMPRESSION|FS_VOL_IS_COMPRESSED;
	char  FileSystemNameBuffer[200];
	DWORD nFileSystemNameSize=200;

	GetVolumeInformation(RootPathName,VolumeNameBuffer,
		    nVolumeNameSize,&VolumeSerialNumber,
		    &MaximumComponentLength,&FileSystemFlags,
		    FileSystemNameBuffer,nFileSystemNameSize);
	return &VolumeNameBuffer[0];
}

//当前目录是否有子目录
BOOL CGetDirectory::DirHaveChildDir(char * dirname)
{
	return (GetChildDirNumber(dirname)==0);
}

//某个目录下子目录的数目
int  CGetDirectory::GetChildDirNumber(char * dirname)
{
	int  number=0;
	char Searchname[200];
	struct _finddata_t fileinfo;
	int  len=strlen(dirname);
	if(dirname[len-1]=='\\')
		wsprintf(Searchname,"%s%s",dirname,"*.*");
	else
		wsprintf(Searchname,"%s\\%s",dirname,"*.*");

	long handle=_findfirst(Searchname,&fileinfo);
	int  ret=0;
	while((handle>0) && (ret==0))
	{			
		if(fileinfo.attrib & _A_SUBDIR)
		{
			if((strcmpi(fileinfo.name,".")!=0) && (strcmpi(fileinfo.name,"..")!=0))
				number++;
		}
		ret=_findnext(handle,&fileinfo);
	}
	return number;
}

//创建树
HTREEITEM CGetDirectory::CreateTree(char * text)
{
	TV_INSERTSTRUCT tci;
	tci.item.mask=TVIF_TEXT|TVIF_PARAM;
	tci.item.stateMask=0;
	tci.item.pszText=text;
	tci.item.iImage=I_IMAGECALLBACK;
	tci.item.iSelectedImage=I_IMAGECALLBACK;
	tci.item.cchTextMax=lstrlen(tci.item.pszText);
	tci.item.lParam=0;
	tci.hParent=NULL;
	tci.hInsertAfter=TVI_LAST;
	return(m_tree.InsertItem(&tci));
}

//插入一项到树中
HTREEITEM CGetDirectory::InsertTreeItem(char * text,long index,HTREEITEM parent,int image)
{
	TV_INSERTSTRUCT tci;
	tci.item.mask=TVIF_TEXT|TVIF_PARAM;
	tci.item.stateMask=0;
	tci.item.pszText=text;
	tci.item.iImage=0;
	tci.item.iSelectedImage=image;
	tci.item.cchTextMax=lstrlen(tci.item.pszText);
	tci.item.lParam=index;
	tci.hParent=parent;
	tci.hInsertAfter=TVI_LAST;
	return(m_tree.InsertItem(&tci));
}

//删除树中某子树中的所有子项,单保留该项
void CGetDirectory::DeleteAllChild(HTREEITEM parent)
{
	if(m_tree.ItemHasChildren(parent))
	{
		HTREEITEM first=m_tree.GetChildItem(parent);
		while(first)
		{
			m_tree.DeleteItem(first);
			first=m_tree.GetChildItem(parent);
		}
	}
}

//设置LONG型变量高字部分
void CGetDirectory::SetHiword(long &want,int value)
{
	long temp=(long)value;
	temp<<=16;
	want|=temp;
}

//设置LONG型变量低字部分
void CGetDirectory::SetLoword(long &want,int value)
{
	long temp=(long)value;
	want|=temp;
}



void CGetDirectory::OnItemexpandingDirtree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM root=pNMTreeView->itemNew.hItem;
	if(root!=m_tree.GetRootItem())
		DirToTree(GetFullName(root),root);
	*pResult = 0;
}

void CGetDirectory::OnSelchangedDirtree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;

	HTREEITEM m_new=pNMTreeView->itemNew.hItem;
	HTREEITEM m_old=pNMTreeView->itemOld.hItem;
	if(m_old!=0)
	{
		UINT m_state=m_tree.GetItemState(m_old,TVIF_STATE);
		m_state&=TVIS_EXPANDED;
		m_tree.SetItemImage(m_old,(m_state==0)?0:1,0);  
	}
	m_tree.SetItemImage(m_new,1,1);  

	UpdateData(TRUE);
	HTREEITEM root=m_tree.GetSelectedItem();
	if(root!=m_tree.GetRootItem())
	{
		CString content=m_dirname;
		char *tail=content.GetBuffer(content.GetLength());
		char * name=strrchr(tail,'\\');
		m_dirname=GetFullName(root);
		UpdateData(FALSE);
	}
	
	*pResult = 0;
}

//双击某项
void CGetDirectory::OnDblclkDirtree(NMHDR* pNMHDR, LRESULT* pResult) 
{				    
	HTREEITEM root=m_tree.GetSelectedItem();
	if(root!=m_tree.GetRootItem())
		DirToTree(GetFullName(root),root);
	*pResult = 0;
}


void CGetDirectory::OnItemexpandedDirtree(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	HTREEITEM root=pNMTreeView->itemNew.hItem;
	m_tree.SetItemImage(root,1,1);  
	*pResult = 0;
}

⌨️ 快捷键说明

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