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