上一篇我们只是给程序定义了大致的功能,以及简单的初始化,这次我们来开发把我们要编辑的图片加载到左边的树控件来,以及筛选出我们要的格式。
这次要实现的功能是
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我们就差这个功能了!我们还是用属性面板来设置他的样式如图,设置下面三个属性即可。
到这里,我们所期望的功能都已经实现了!!
运行后还是有些成就干的!哈哈
下一次我们要开始实现绘图区的功能了!希望大家继续关注