几乎每个软件都有"打开"、’'保存"的功能。以“记事本为打开功能”为例,其打开对话画框的界面如下:
//截图
其保存对画框,与打开对话框界面基本一样,下面也给程序增加这样的对话框,我们可以使用MFC提供的CFileDialog类来完成;
CFileDialg类
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能,该类的派生层次如下:
从上图中,可以看出这个类也是对话框的类,显示对话框可以使用DoModal函数来完成;
要使用CFileDialog,需要先用CFileDialog构造函数构造一个对象,其构造函数如下:
CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
参数:
bOpenFileDialg
如果为TRUE, 则创建文件打开对话框;如果为FALSE,则构造一个File Save As(另存为)对话框。
lpszDefExt
缺省文件扩展名,如果用户在文件名编辑框中不包含扩展名,则lpszDefExt定义的扩展名自动加到文件名后。如果为NULL,则不添加扩展名。
lpszFileName
初始显示于文件名编辑框中的文件名,如果为NULL,则不显示初始文件名。
dwFlags
一个或多个标志的组合,使你可定制对话框。如果你改变m_ofn.Flags结构成员,在改变中用OR操作保持缺省行为完整。
lpszFilter
一列字符串对,指定可以应用到文件的过滤器。如果指定过滤器,仅被选择的文件显示于文件列表框中。
pParentWnd
指向文件对话框对象的父窗口或拥有者窗口。
其中lpszFilter是个很重要的一个参数,想要完成文件过滤显示功能,需要对这个参数进行赋值;
其格式说明如下:
双字符串的第一个字符串描述过滤器,第二个串表明使用的文件扩展名,多重扩展可用“;”来指定。字符串由两个“|”字符结尾;
如果lpszFilter不是以默认构造形式赋值,而是通过m_ofn.lpszFilter形式赋值,我们需要将过滤器字符串中的“|”替换成”\0“;
形如:
CFileDialog fdlg(FALSE, NULL, _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("文本文件(*.txt)|*.txt|C++ source file(*.h; *.c; *.cpp)|*.h; *.c; *.cpp | 视频文件(*.avi) | *.avi | 所有文件(*.*) | *.* || "));
TCHAR szFilters[] =
"C++ source file(*.h;*,hpp;*.cpp)\0*.h;*.hpp;*.cpp\0"\
"Text File(*.txt)\0*.txt\0"\
"All Typle(*.*)\0*.*\0" \
"Lua source file(*.lua)\0*.lua\0"\
"\0";
如果想对对话框作更多定制,我们可通过成员数据m_ofn对对话框进行更多赋值,该参数是Windows OPENFILENAME结构,更多信息参照网上介绍
OnBnClickedOpen()函数实现:
添加控件后的事件
/****************************************************************
*函数名称: 打开对话框
*功 能: 打开选择的文本文件
*作 者:kiki
*日 期:2019/5/7
****************************************************************/
void CDay506Dlg::OnBnClickedOpen()
{
//定义文件对话框
CFileDialog fdlg(TRUE, NULL, _T("*.*"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("文本文件(*.txt)|*.txt|视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||"));
if (IDCANCEL == fdlg.DoModal())
{
return;
}
//读取当前对话框选择的文件路径
CString strPathName = fdlg.GetPathName();
//读取路径名到编辑框
SetDlgItemText(IDC_EDIT1, strPathName);
//打开选择的文件
//构造文件,同时增加异常处理
CFile cFile;
CFileException e;
if (FALSE == cFile.Open(strPathName, CFile::modeRead,&e))
{
CString strException;
strException.Format(_T("This file could not be opened\n\t error code: %d\n"), e.m_cause);
MessageBox(strException, _T("kiki Tips:"), MB_OK | MB_ICONERROR);
return;
}
//添加一个显示内容的编辑框 属性打开多行和垂直滚动显示
//读取打开的文件内容
DWORD dwCount, dwFilelenth = (DWORD)cFile.GetLength();
char* szBuffer = new char[dwFilelenth + 1];
ZeroMemory(szBuffer, dwFilelenth + 1);
CString strContent;
while (dwCount = cFile.Read(szBuffer, dwFilelenth))
{
//拼接读取数据
strContent += szBuffer;
}
//字节转换
int len = WideCharToMultiByte(CP_UTF8, 0, strContent, strContent.GetLength(), NULL, NULL, NULL, NULL);
char *pMulticharBuf = new char[len + 1];
ZeroMemory(pMulticharBuf, sizeof(char)*len);
WideCharToMultiByte(CP_UTF8, 0, strContent,-1, pMulticharBuf, len, NULL, NULL);
SetDlgItemText(IDC_EDIT2, strContent);
cFile.Close();
delete[] szBuffer;
szBuffer = nullptr;
}
OnBnClickedSaveAs()函数实现:
/****************************************************************
*函数名称: save as 对话框
*功 能: 另存文本文件
*作 者:kiki
*日 期:2019/5/7
****************************************************************/
void CDay506Dlg::OnBnClickedSaveAs()
{
// TODO: 在此添加控件通知处理程序代码
//save as dialog
CFileDialog fdlg(FALSE, NULL, _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
, _T("文本文件(*.txt)|*.txt|C++ source file(*.h; *.c; *.cpp)|*.h; *.c; *.cpp | 视频文件(*.avi) | *.avi | 所有文件(*.*) | *.* || "));
if (IDCANCEL == fdlg.DoModal())
{
return;
}
CString strPathName = fdlg.GetPathName();
//文件指针和异常
CFile cFile;
CFileException e;
//链接缓冲
CString strContent;
//要写入字符串的长度
//GetDlgItemText(IDC_EDIT2, strContent);
GetDlgItem(IDC_EDIT2)->GetWindowText(strContent);
DWORD dwFilelenth = (DWORD)strContent.GetLength();
if (IDOK == cFile.Open(strPathName, CFile::modeCreate | CFile::modeReadWrite, &e))
{
int len = WideCharToMultiByte(CP_ACP, 0, strContent, strContent.GetLength(), NULL, NULL, NULL, NULL);
char *pMulticharBuf = new char[len+1];
ZeroMemory(pMulticharBuf, sizeof(char)*len);
WideCharToMultiByte(CP_ACP, 0, strContent, strContent.GetLength(), pMulticharBuf, len, NULL, NULL);
pMulticharBuf[len + 1] = '\0';
cFile.Write(pMulticharBuf, len);
cFile.Flush();
}
cFile.Close();
}
OnBnClickedNewFile()函数实现:
/****************************************************************
*函数名称: New File对话框
*功 能: 新建文本文件
*作 者:kiki
*日 期:2019/5/7
****************************************************************/
void CDay506Dlg::OnBnClickedNewFile()
{
// TODO: 在此添加控件通知处理程序代码
CString strException;
strException.Format(_T("A new file will be created\n"));
MessageBox(strException, _T("kiki Tips:"), MB_OK);
SetDlgItemText(IDC_EDIT1, NULL);
SetDlgItemText(IDC_EDIT2, NULL);
strException.Format(_T("The new file was created successfully.\n"));
MessageBox(strException, _T("kiki Tips:"), MB_OK);
}
//打开
//save as
//新建
基本功能就这,以后有时间了再丰富一下