游戏开发工具之纹理打包器-2.打开文件夹遍历指定格式的图片,以及显示到tree控件上

上一篇我们只是给程序定义了大致的功能,以及简单的初始化,这次我们来开发把我们要编辑的图片加载到左边的树控件来,以及筛选出我们要的格式。

这次要实现的功能是

1.  使用CMFCEditBrowseCtrl打开文件夹。

2.  给CTreeCtrl设置显示样式。

3.  使用CFileFind遍历文件夹下的所有目录包括子目录。

4.  筛选出指定格式的图片。

5.  给CtreeCtrl控件添加说略图。

首先我们先来看一下完成后的效果。


选择一个路后,我们可以看到树控件会导入我们文件夹里的子文件夹和文件,并可以和Window的资源管理器一样,展开和收缩目录。

开始上代码

首先我们要修改CMFCEditBrowseCtrl控件的Browsermode 因为它默认模式是浏览文件,而我们要浏览的是文件夹。

打开CMFCEditBrowseCtrl的属性面板,把默认值改成Folder Browse。可视化操作很容易吧!

你也可以通过代码来改变它的浏览模式,例如在Dlg类里的初始化函数里加入。(m_edBrowse是我们给CMFCEditBrowseCtrl控件做的连接名)

m_edBrowse.EnableBrowseButton(true);
m_edBrowse.EnableFolderBrowseButton();


然后给他添加一个事件,就是当路径有所改变的时候就执行一个函数,通知我们程序去遍历指定路径的子文件。(如下图)



添加完后VS会自动帮我们生成代码,在Dlg.cpp文件里找到这个函数,添加如下代码

代码有注释,我就不废话了

void CImgsToolDlg::onEdBrowseUpdate()
{
	
	CString fileName;
	m_edBrowse.GetWindowText(fileName);//获取当前路径
	m_fileTree.DeleteAllItems();
	scanDiskFile(fileName);//遍历文件
}

void CImgsToolDlg::scanDiskFile( const CString& strPath, HTREEITEM hParent /*= NULL*/, CImageList* hImgList /*= NULL*/ )
{
	bool isScanFile = true;		//是否要遍历子文件?
	HTREEITEM parent;			//树的父级
	CString m_fName;				//将会被添加到树中的文件名
	PageProperty* paProperty;	//为每个树节点绑定的数据,是一个自定义的结构
	CImageList* imgList;			//显示在树控件中的图片列表
	int cutSize = 24;				//缩略图的大小
	if(hImgList == NULL){
		//创建一个用于显示缩略图的图片列表
		imgList = new CImageList;
		imgList->Create(cutSize, cutSize, ILC_COLOR32, 1, 1);
		TCHAR	 szCurrDir[_MAX_PATH];	
		::GetCurrentDirectory(_MAX_PATH, szCurrDir);//获取当前程序的目录
		wsprintf(szCurrDir,L"%s\\res\\ifile.png",szCurrDir);//合成一个图片的完整路径
		addImgToImgList(imgList, szCurrDir, cutSize);//自定义的一个函数,将指定路径的图片添加到imgList里去。
	}else{
		imgList = hImgList;
	}
	//新建一个CFileFiind 对象,用来遍历文件夹
	CFileFind* finder = new CFileFind;
	bool isFind = finder->FindFile(strPath+L"\\*");//搜索指定文件名
	while(isFind){
		paProperty = new PageProperty;
		isFind = finder->FindNextFileW();//搜搜下一个文件
		bool isDirectory = finder->IsDirectory();//判断是否为目录
		if(finder->IsDots())//如果是"."或者".."
			continue;
		if(isDirectory && isScanFile){
			//如果是目录
			m_fName = finder->GetFileName();//获取文件名
			parent = paProperty->hitem = m_fileTree.InsertItem(m_fName, 0, 0, hParent == NULL? TVI_ROOT : hParent);//添加节点到CTreeCtrl控件
			scanDiskFile(strPath + L"\\" + m_fName, parent, imgList);//规递调用
		}else{
			//如果是图片文件
			m_fName = finder->GetFileName();
			if(checkImageFormat(&m_fName)){//判断是不是我们要的图片格式
				paProperty->fileName = strPath + L"\\" + m_fName;
				int index = addImgToImgList(imgList, paProperty->fileName, cutSize);//添加缩略图到ImageList;
				paProperty->hitem = m_fileTree.InsertItem(m_fName, index-1, index-1, hParent == NULL? TVI_ROOT: hParent);//添加节点到CTreeCtrl控件,并设置一个缩略图
				m_fileTree.SetItemData(paProperty->hitem, (DWORD_PTR)paProperty);//给CTreeCtrl项绑定数据
			}
		}		
	}
	finder->Close();//关闭查找
	m_fileTree.SetImageList(imgList, LVSIL_NORMAL);//设置图片列表
}
//检查图片文件是不是我们支持的格式
bool CImgsToolDlg::checkImageFormat( const CString* fileName )
{
	int lenth = fileName->GetLength();
	if(lenth<=4)return false;
	if(m_ckBPng.GetCheck()){
		if(fileName->Find(L".png")!=-1)
			return true;
	}
	if(m_ckBJpg.GetCheck()){
		if(fileName->Find(L".jpg")!=-1)
			return true;
	}
	if(m_ckBGif.GetCheck()){
		if(fileName->Find(L".gif")!=-1)
			return true;
	}
	return false;
}

//缩放图片
CBitmap* CImgsToolDlg::scaleBitmap (CBitmap* pBitmap,int width,int height)
{
	BITMAP bm1;
	CDC *p_MDC1=new CDC;
	CDC *p_MDC2=new CDC;
	CBitmap* pOldBt1,*pOldBt2;
	CBitmap *bmPtr=new CBitmap;
	CClientDC dc(this);

	p_MDC2->CreateCompatibleDC(&dc);
	pOldBt2=p_MDC2->SelectObject(pBitmap);

	p_MDC1->CreateCompatibleDC (&dc);
	bmPtr->CreateCompatibleBitmap(&dc,width,height);	
	pOldBt1=p_MDC1->SelectObject(bmPtr);

	GetObject(*pBitmap,sizeof(bm1),&bm1); 
	p_MDC1->StretchBlt (0,0,width,height,p_MDC2,0,0,bm1.bmWidth ,bm1.bmHeight ,SRCCOPY);

	p_MDC1->SelectObject(pOldBt1);
	p_MDC1->DeleteDC ();
	p_MDC2->SelectObject (pOldBt2);
	p_MDC2->DeleteDC ();

	return  bmPtr;
}
//添加图片到指定的CimageList里,并返回图片索引
int CImgsToolDlg::addImgToImgList( CImageList* pImageList, CString resourceName, int cutSize )
{

	CImage* scaleImg = new CImage;
	scaleImg->Load(resourceName);

	HBITMAP hbmp =(HBITMAP)scaleImg->operator HBITMAP();
	CBitmap* bm = new CBitmap;
	bm->Attach(hbmp);
	bm = scaleBitmap(bm, cutSize, cutSize);
	pImageList->Add(bm,RGB(0,255,0));
	return pImageList->GetImageCount();
}

写到这里,我们已经实现了打开文件夹、遍历文件夹、筛选出指定的格式、添加缩略图


运行后


还是没有显示出跟windows的资源管理器一样,有线以及在目前显示+好

OK我们就差这个功能了!我们还是用属性面板来设置他的样式如图,设置下面三个属性即可。


到这里,我们所期望的功能都已经实现了!!

运行后还是有些成就干的!哈哈

下一次我们要开始实现绘图区的功能了!希望大家继续关注


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值