Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209525
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 978
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-10 15:46
个人简介

青春无悔

文章分类

全部博文(93)

文章存档

2015年(16)

2014年(77)

我的朋友

分类: WINDOWS

2014-11-10 17:03:04

今天,又看了这些东西,在VC里面创建浏览文件对话框比创建浏览文件夹对话框要简单一些。

          
    一、创建“浏览文件对话框”
        用CFileDialog类实现,比如:
    
        CFileDialog  FDlg(TRUE , ".doc" , NULL , OFN_HIDEREADONLY , "word文件(*.doc)|*.doc|所有文件(*.*) |*.*||" );
        if(FDlg.DoModal() == IDOK)
        {
            filePath = FDlg.GetPathName();
            UpdateData(false);
            filePath.Replace("//","////");
        }
        CFileDialog文件选择对话框的使用:

    首先构造一个对象并提供相应的参数,构造函数原型如下:
    CFileDialog::CFileDialog(
        BOOL bOpenFileDialog, //为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框
        LPCTSTR lpszDefExt = NULL, //默认的文件扩展名
        LPCTSTR lpszFileName = NULL, //默认的文件名
        DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //设定风格
        LPCTSTR lpszFilter = NULL, //列出可供选择的文件类型和相应的扩展名
        CWnd* pParentWnd = NULL //父窗口句柄指针
    );
 

LPCTSTR lpszFilter 参数格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。

创建文件对话框可以使用DoModal(),在返回后可以利用下面的函数得到用户选择: 
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目录名和扩展名如:c:/test/test1.txt 
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括扩展名如:test1.txt 

        二、创建“浏览文件夹的对话框”
        这个没办法用CFileDialog类来实现了,可以用回调函数,如下:
    
            CString sFolderPath;

        BROWSEINFO bi;
        char Buffer[MAX_PATH];
        //初始化入口参数bi开始
        bi.hwndOwner = NULL;
        bi.pidlRoot =NULL;//初始化制定的root目录很不容易,
        bi.pszDisplayName = Buffer;//此参数如为NULL则不能显示对话框
        bi.lpszTitle = "修改接收路径";
        //bi.ulFlags = BIF_BROWSEINCLUDEFILES;//包括文件
        bi.ulFlags = BIF_EDITBOX;//包括文件

        bi.lpfn = NULL;
        bi.iImage=IDR_MAINFRAME;
        //初始化入口参数bi结束
        LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//调用显示选择对话框
        if(pIDList)
        {
               SHGetPathFromIDList(pIDList, Buffer);
               //取得文件夹路径到Buffer里
               sFolderPath = Buffer;//将文件夹路径保存在一个CString对象里
        }


        LPMALLOC lpMalloc;

        if(FAILED(SHGetMalloc(&lpMalloc)))

                return;

        lpMalloc->Free(pIDList);

        lpMalloc->Release();
        MessageBox(sFolderPath,"Title",MB_OK);


    三、创建可以多选的“浏览文件对话框”
    

    使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。   

    
  如果是在Windows   NT   4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。   
    
  以下是一个使用该类进行多文件名选择的例子:   
    
              #include   "cderr.h"   //for   definition   of   FNERR_BUFFERTOOSMALL   
    
              CFileDialog       dlg(   TRUE,   NULL,   NULL,  
 OFN_ALLOWMULTISELECT,   NULL,   NULL   );   
              DWORD   MAXFILE   =   4000 ;  
              dlg.m_ofn.nMaxFile   =   MAXFILE;   
              char*   pc   =   new   char[MAXFILE];   
              dlg.m_ofn.lpstrFile   =   pc;   
              dlg.m_ofn.lpstrFile[0]   =   NULL;   
    
              int   iReturn   =   dlg.DoModal();   
              if(iReturn   ==     IDOK)   
              {   
                    int   nCount   =   0;   
                    POSITION   pos   =   dlg.GetStartPosition();  
                    CString FileName; 
                    while   (pos   !=   NULL)   
                    {   
                          FileName = dlg.GetNextPathName(pos);   
                          AfxMessageBox(FileName); 
//显示所选的多个文件的路径
                          nCount++;   //记录所选文件的数目
                    }   
                    CString   str;   
                    str.Format("Successfully   opened   %d   files/n",   nCount);   
                    AfxMessageBox(str);   
              }   
              else   if(iReturn   ==   IDCANCEL)   
                    AfxMessageBox("Cancel");   
    
              if(CommDlgExtendedError()   ==   FNERR_BUFFERTOOSMALL)   
                    AfxMessageBox("BUFFERTOOSMALL");   
              delete   [] pc;

    看起来还是比较麻烦的,有可能是因为我们没有认真地去弄明白里面的每一个参数到底是干什么用的,所以看到这么多参数,就感觉不舒服,我也是。当然,如果去看看这些类是怎么回事,倒会好些。
阅读(478) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~