vc学习历程(7)--文件浏览对话框

来源:互联网 发布:大豆基因组数据库 编辑:程序博客网 时间:2024/06/04 17:53

浏览对话框代码:

{
 BROWSEINFO bi;  
 char buffer[MAX_PATH];  
 ZeroMemory(buffer,MAX_PATH);  
 bi.hwndOwner=GetSafeHwnd();  
 bi.pidlRoot=NULL;  
 bi.pszDisplayName=buffer;  
 bi.lpszTitle="选择一个文件夹";  
 bi.ulFlags=BIF_EDITBOX;  
 bi.lpfn=NULL;  
 bi.lParam=0;  
 bi.iImage=0;
 LPITEMIDLIST pList=NULL;  
 if((pList=SHBrowseForFolder(&bi))!=NULL)  
 {  
  char path[MAX_PATH];
  ZeroMemory(path,MAX_PATH);
  SHGetPathFromIDList(pList,path);
  GetDlgItem(IDC_EDADD)->SetWindowText(path);
 }

程序说明分析:

WINSHELLAPI   LPITEMIDLIST   WINAPI   SHBrowseForFolder(  
          LPBROWSEINFO   lpbi  
  );  
  SHBrowseForFolder函数返回一个ITEMIDLIST结构的指针,这个结构包含了用户选择文件夹的信息,需要注意的是,SHBrowseForFolder函数要求调用程序负责删除这个指针。如果用户选择了“取消”按钮,则返回NULL。SHBrowseForFolder函数的参数是一个BROWSEINFO结构变量,它的定义如下:  
  typedef   struct   _browseinfo   {    
          HWND   hwndOwner;   //   父窗口的句柄  
          LPCITEMIDLIST   pidlRoot;   //   一个ITEMIDLIST结构变量,指定根目录  
          LPSTR   pszDisplayName;   //    
          LPCSTR   lpszTitle;   //   位于对话框顶端的一行文字  
          UINT   ulFlags;   //   标志变量,按位有效  
          BFFCALLBACK   lpfn;   //   回调函数  
          LPARAM   lParam;   //   传给回调函数的参数,一个32位值  
          int   iImage;   //   被选择的文件夹的图片序号,与shell32.dll中的图标号同  
  }   BROWSEINFO,   *PBROWSEINFO,   *LPBROWSEINFO;  
  ulFlags参数在浏览文件夹时一般取值为BIF_BROWSEFORCOMPUTER,这样,对话框将只允许指定在实际文件系统中存在的文件夹,否则“确定”按钮将会被禁用。  
  如果SHBrowseForFolder函数返回的ITEMIDLIST结构指针不为NULL,就可以使用SHGetPathFromIDList函数取得存储于ITEMIDLIST结构指针中的路径信息。SHGetPathFromIDList函数的原型如下:  
  WINSHELLAPI   BOOL   WINAPI   SHGetPathFromIDList(  
          LPCITEMIDLIST   pidl,  
          LPSTR   pszPath  
  );  
  第一个参数就是存储了路径信息的ITEMIDLIST结构指针,第二个参数是一个字符缓冲区,用于接收字符串。它应当有_MAX_PATH所指定的长度,_MAX_PATH在Windows系统中被定义为260个字符,其大小可以是260或520个字节,这取决于是否使用了Unicode。  
  现在,让我们来制作一个工程。打开App   Wizard,创建一个MFC   EXE对话框工程,名为SelFolder,然后在Workspace窗口的FileView中将SelFolder.rc,SelFolder.h,SelFolderDlg.h,SelFolderDlg.cpp,Resource.h及以Res文件夹都删除,只保留SelFolder.cpp、Stdafx.h和Stdafx.cpp三个文件,现将SelFolder.cpp文件修改如下:  
   
  #include   "stdafx.h"  
   
  struct   CSelFolderApp   :   public   CWinApp  
  {  
  virtual   BOOL   InitInstance();  
  }   theApp;  
   
  BOOL   CSelFolderApp::InitInstance()  
  {  
  //   要求Windows   95/NT4   或更新版本  
  ASSERT(LOBYTE(LOWORD(GetVersion()))   >=   4);  
   
  TCHAR   szPath[_MAX_PATH];  
  BROWSEINFO   bi;  
  //   指定父窗口,在对话框显示期间,父窗口将被禁用  
  bi.hwndOwner   =   NULL;  
  //   如果指定NULL,就以“桌面”为根  
  bi.pidlRoot   =   NULL;  
  //   这一行将显示在对话框的顶端  
  bi.lpszTitle   =     _T("请选择一个文件夹");  
  bi.pszDisplayName   =   szPath;  
  //   只返回文件系统中存在的文件夹  
  bi.ulFlags   =   BIF_RETURNONLYFSDIRS;  
  bi.lpfn   =   NULL;   //   回调函数的指针  
  bi.lParam   =   NULL;   //   传向回调函数的参数  
   
  //   现在,调用函数来显示对话框  
  //   它总与Windows的外壳程序Explorer保持相同的外观  
  LPITEMIDLIST   pItemIDList   =   SHBrowseForFolder(   &bi   );  
   
  if   (   pItemIDList   )   //   点按了“确定”按钮  
  {  
  TCHAR   szPath[   _MAX_PATH   ];  
  if   (   SHGetPathFromIDList(pItemIDList,   szPath)   )  
  {  
  //   成功地取得了文件夹信息  
  CString   strMessage;  
  strMessage.Format("选定的文件夹是/'%s/'",   szPath);  
  AfxMessageBox(   strMessage   );  
  }  
  //   防止内存泄漏,要使用IMalloc接口  
  IMalloc*   pMalloc;  
  if   (   SHGetMalloc(   &pMalloc   )   !=   NOERROR   )  
  {  
  //   未返回有效的IMalloc接口指针  
  TRACE(_T("无法取得外壳程序的IMalloc接口/n"));  
  }  
  pMalloc->Free(   pItemIDList   );  
  if   (   pMalloc   )  
  pMalloc->Release();  
  }  
   
  //   已完成任务,所以返回FALSE来终止进程  
  return   FALSE;  
  }   //   InitInstance  

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿身高长得慢怎么办 四个月的宝宝哭怎么办 孕39周羊水偏多怎么办 孕39周羊水浑浊怎么办 孕晚期羊水过少怎么办 怀孕脐带绕颈一周怎么办 nt检查宝宝趴着怎么办 四维胎儿有问题怎么办 怀孕70天没有胎心怎么办 怀孕20天不想要怎么办 换轮胎胎压监测怎么办 怀孕了吐的厉害该怎么办 怀孕吐完嗓子疼怎么办 怀孕16周不想要怎么办 怀孕四个月胎盘低置怎么办 孕37周胎盘三级怎么办 孕37周胎盘老化怎么办 怀孕22周胎盘1级怎么办 婴儿吃奶粉吐奶怎么办 宝宝吐奶又拉稀怎么办 羊水穿刺21三体怎么办 开始长妊娠纹了怎么办 已经长了妊娠纹怎么办 孕晚期长妊娠纹怎么办 妊娠纹长出来了怎么办 没提前预约四维怎么办 ct检查冠脉钙化怎么办 残角子宫有内膜怎么办 怀孕了长痔疮了怎么办 人流后子宫内膜薄怎么办 多囊子宫内膜薄怎么办 6岁儿童不爱睡觉怎么办 初生儿嗓子哑了怎么办 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办