VC++ 打开文件夹,保存文件等对话框的调用

VC++ 打开文件夹,保存文件等对话框的调用

一。打开文件夹:

1。CFileDialog实现

CFileDialog hFileDlg(true,NULL ,
NULL,
   OFN_FILEMUSTEXIST | OFN_READONLY | OFN_PATHMUSTEXIST,
TEXT("驱动文件 (*.sys)|*.sys|所有文件(*.*)|*.*|"),
NULL);
if(hFileDlg.DoModal() == IDOK)
{
m_path = hFileDlg.GetPathName();
UpdateData(FALSE);
}

2。API实现


OPENFILENAMEA ofn;       
char szFile[260];       

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "音频文件\0*.wma\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = 0;


if (GetOpenFileNameA(&ofn)==FALSE) 
return S_FALSE;

CString c_save_path=ofn.lpstrFile;

二、保存文件

同上,只不过将“ CFileDialog hFileDlg(true,NULL ”改为“ CFileDialog hFileDlg(false,NULL ”,或者将GetOpenFileNameA改为GetSaveFileNameA,即可。

三、浏览文件夹对话框

//回调函数
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    if(uMsg==BFFM_SELCHANGED||uMsg==BFFM_INITIALIZED)
    {
        if(uMsg==BFFM_INITIALIZED)
        {
            ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,
                LPARAM(lpData));
        }
    }
    return 0;
}


TCHAR chPath[255]; //用来存储路径的字符串
CString strPath = "";
BROWSEINFO bInfo;
GetModuleFileName(NULL,chPath,MAX_PATH);
strPath=chPath;
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner = m_hWnd;
bInfo.lpszTitle = _T("请选择路径: ");     
bInfo.ulFlags   = BIF_RETURNONLYFSDIRS|BIF_EDITBOX;
bInfo.lpfn      = BrowseCallbackProc;
bInfo.lParam    = (LPARAM)strPath.GetBuffer(strPath.GetLength());

LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
lpDlist = SHBrowseForFolder(&bInfo) ; //显示选择对话框
if(lpDlist != NULL) //用户按了确定按钮
{
SHGetPathFromIDList(lpDlist, chPath);//把项目标识列表转化成字符串
strPath = chPath; //将TCHAR类型的字符串转换为CString类型的字符串
m_save_path=strPath;
UpdateData(FALSE);
}

对应事件加入下面代码:

BROWSEINFO   BrowseInfo; 
memset(&BrowseInfo,0,sizeof(BROWSEINFO)); 
LPITEMIDLIST   pItemID; 
BrowseInfo.hwndOwner=NULL;//m_hWnd; //非模态 
BrowseInfo.pidlRoot=NULL; 
BrowseInfo.ulFlags=BIF_BROWSEINCLUDEFILES; 
BrowseInfo.lpfn=NULL;//BrowseCallBackProc; 
   
pItemID=SHBrowseForFolder(&BrowseInfo); 
if(pItemID) 

char   szPath[MAX_PATH]; 
if(SHGetPathFromIDList   (pItemID,szPath)) 

   IMalloc*   pMalloc; 
   if(SUCCEEDED(::Co GetMalloc_r(1,&pMalloc))) 
   { 
    pMalloc->Free(pItemID); 
    pMalloc->Release(); 
   } 

m_strDFilePath = szPath; //m_strDFilePath 存储了文件路径
UpdateData(FALSE);
//MessageBox("设置路径成功,图片将存于 "+m_strDFilePath);
}

BROWSEINFO说明
  Visual C++(VC)中,BROWSEINFO结构中包含有用户选中目录的重要信息。

  (1)BROWSEINFO结构

  ●定义

  typedef struct_browseinfo

  {

  HWND hwndOwner;

  LPCITEMIDLIST pidlRoot;

  LPSTR pszDisplayName;

  LPCSTR lpszTitle;

  UINT ulFlags;

  BFFCALLBACK lpfn;

  LPARAM lParam;

  int iImage;

  }BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;

  ●成员变量

  hwndOwner:浏览文件夹对话框的父窗体句柄。

  pidlRoot:ITEMIDLIST结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。该成员变量可以是NULL,在此时桌面目录将被使用。

  pszDisplayName:用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。

  lpszTitle:该浏览文件夹对话框对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。

  ulFlags:该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合:

  BIF_BROWSEFORCOMPUTER:返回计算机名。除非用户选中浏览器中的一个计算机名,否则该对话框中的“OK”按钮为灰色。

  BIF_BROWSEFORPRINTER:返回打印机名。除非选中一个打印机名,否则“OK”按钮为灰色。

  BIF_BROWSEINCLUDEFILES:浏览器将显示目录,同时也显示文件。

  BIF_DONTGOBELOWDOMAIN:在树形视窗中,不包含域名底下的网络目录结构。

  BIF_EDITBOX:浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。

  BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。

  BIF_RETURNONLYFSDIRS:仅仅返回文件系统的目录。例如:在浏览文件夹对话框中,当选中任意一个目录时,该“OK”按钮可用,而当选中“我的电脑”或“网上邻居”等非有意义的节点时,“OK”按钮为灰色。

  BIF_STATUSTEXT:在对话框中包含一个状态区域。通过给对话框发送消息使回调函数设置状态文本。

  BIF_VALIDATE:当没有BIF_EDITBOX标志位时,该标志位被忽略。如果用户在编辑框中输入的名字非法,浏览对话框将发送BFFM_VALIDATEFAILED消息给回调函数。

  lpfn:应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,该对话框将调用回调函数。该参数可用为NULL。

  lParam:对话框传递给回调函数的一个参数指针。

  iImage:与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。

你可能感兴趣的:(VC++ 打开文件夹,保存文件等对话框的调用)