实现MFC的两种类型文件对话框

在使用MFC中,我们经常使用到CFileDialog文件对话框,如果不使用MFC,用Win32如何来实现这种对话框呢?


我们要做的第一个对话框样式就下面这种


这里写图片描述

/************************************************************/
/* 类似MFC的CFileDialog对话框,通过使用GetOpenFileName来实现 
/* hWnd:父窗口句柄
/* buf:返回文件的完整路径
/* nBufSize:buf的大小
/* title:对话框的标题
/*************************************************************/
bool GetFileNameDlg(HWND hWnd,char *buf,int nBufSize,char *title)
{
    OPENFILENAME fn;
    char * filter = "EXE(*.exe)*.exeAll files*.*";
    memset(&fn,0,sizeof(OPENFILENAME));
    memset(buf,0,nBufSize);
    fn.hwndOwner = hWnd; //设置后就是模态对话框
    fn.lStructSize = sizeof(OPENFILENAME); //结构体大小
    fn.lpstrFilter = filter; //设置过滤器
    fn.lpstrFile = buf; //文件路径
    fn.nMaxFile = nBufSize; 
    fn.lpstrTitle = title; //对话框标题
    fn.Flags = OFN_FILEMUSTEXIST;
    if (GetOpenFileName(&fn))
    {
        return true ;
    } 
    else
    {
        return false ;
    }
}

———-

再做第二种对话框,就是下面这种


这里写图片描述

/************************************************************************/
/* 选择文件夹对话框,通过使用SHBrowseForFolder和SHGetPathFromIDList来实现 
/* hWnd:父窗口句柄
/* buf:返回文件夹的完整路径
/* nBufSize:buf的大小
/* title:对话框的标题
/************************************************************************/
bool GetFloderDlg(HWND hWnd,char *buf,int nBufSize,char *title)
{
    BROWSEINFO bi;
    memset(&bi,0,sizeof(BROWSEINFO));
    memset(buf,0,nBufSize);
    bi.hwndOwner = hWnd; //设置后就是模态对话框
    bi.lpszTitle = title; //对话框标题
    bi.ulFlags = BIF_RETURNFSANCESTORS;
    LPITEMIDLIST idl = SHBrowseForFolder(&bi);
    if ( idl == NULL)
    {
        return false ;
    }
    SHGetPathFromIDList(idl,buf);
    return true ;
}

        char szBuf[MAX_PATH];
        GetFloderDlg(hwnd,szBuf,MAX_PATH,"文件对话框");
        GetFileNameDlg(hwnd,szBuf,MAX_PATH,"文件对话框");
   通过调用函数就实现了MFC中CFileDialog的效果,相比较MFC中的,这个效率稍微高一些。
原文地址:https://www.cnblogs.com/cuglzf/p/8490685.html