在使用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)\0*.exe\0All files\0*.*\0\0";
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中的,这个效率稍微高一些。