MFC 打开、保存文件对话框

最近要做一个文件打开和保存的对话框,现将相关的代码记录如下,用以备忘!

所用控件:

2个静态标签(Static Text):用以显示功能标签;

2个文本框(Edit):用以显示打开的文件路径全名要保存的文件路径全名,设置其Read Only属性为true将文本框设置为不可编辑;

2个按钮(Button):用以浏览文件;

打开文件对话框

CFileDialog打开的对话框

 

代码如下:

 

//打开文件
void COpenSaveFileDialogDlg::OnBnClickedButtonOpen()
{
	BOOL isOpen = TRUE;		//是否打开(否则为保存)
	CString defaultDir = L"E:\\FileTest";	//默认打开的文件路径
	CString fileName = L"";			//默认打开的文件名
	CString filter = L"文件 (*.doc; *.ppt; *.xls)|*.doc;*.ppt;*.xls||";	//文件过虑的类型
	CFileDialog openFileDlg(isOpen, defaultDir, fileName, OFN_HIDEREADONLY|OFN_READONLY, filter, NULL);
	openFileDlg.GetOFN().lpstrInitialDir = L"E:\\FileTest\\test.doc";
	INT_PTR result = openFileDlg.DoModal();
	CString filePath = defaultDir + "\\test.doc";
	if(result == IDOK) {
		filePath = openFileDlg.GetPathName();
	}
	CWnd::SetDlgItemTextW(IDC_EDIT_SRC, filePath);
}

//保存文件
void COpenSaveFileDialogDlg::OnBnClickedButtonSave()
{
BOOL isOpen = FALSE; //是否打开(否则为保存)
CString defaultDir = L"E:\FileTest"; //默认打开的文件路径
CString fileName = L"test.doc"; //默认打开的文件名
CString filter = L"文件 (.doc; .ppt; .xls)|.doc;.ppt;.xls||"; //文件过虑的类型
CFileDialog openFileDlg(isOpen, defaultDir, fileName, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, filter, NULL);
openFileDlg.GetOFN().lpstrInitialDir = L"E:\FileTest\test.doc";
INT_PTR result = openFileDlg.DoModal();
CString filePath = defaultDir + "\" + fileName;
if(result == IDOK) {
filePath = openFileDlg.GetPathName();
}
CWnd::SetDlgItemTextW(IDC_EDIT_DEST, filePath);
}
========================================================================================================
VC++中打开文件对话框和保存文件对话框
CString filePath;
char szFilter[] = {"All Files(.)|.||"}; C
FileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
if(dlg.DoModal() == IDOK)
{
  filePath = dlg.GetPathName();
  lpszFileName = (LPCTSTR)filePath;  //lpszFileName是一个全局变量
}
else
{ } 如果要将打开的文件的内容显示到编辑框中,可以把读出的内容放到一个缓冲区中,然后再放到CString类型编辑框变量m_szDisplay中,就可以在编辑框中显示,别忘了Update(FALSE);当然也可以使用SendMessage函数。

void CProcessDlg::OnSave()
{ // TODO: Add your control notification handler code here
char szFilter[] = {"TXT Files (.txt)|.txt|Excel Files (.xls)|.xls||"};
CString fileName; fileName = ".";

CFileDialog dlg(FALSE,"txt",fileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);//dlg.m_ofn.lpstrDefExt = "txt";
	
	if(dlg.DoModal() == IDOK)
	{
		//fileName = dlg.GetFileName();
		CFile file;
		file.Open(fileName,CFile::modeCreate | CFile::modeReadWrite);
		//file.Write(fileName.GetBuffer(fileName.GetLength()),fileName.GetLength());
		//将编辑框中的内容写到文件中
		file.Write(m_szDisplay.GetBuffer(m_szDisplay.GetLength()),m_szDisplay.GetLength());
		file.Close();
	}
	else
	{
	}
}
因为这段代码只是一个工具的一部分代码,所以有些变量在这段代码中没有定义,也有一部分代码感觉是多余的。
=====================================================================================================

CFileDialog调用出错的解决办法

CFileDialog调用出错的解决办法

我在使用CFileDialog出现内存问题,不会跟踪,但是怀疑是析构~CFileDialog出现的问题

找了很久,有说是需要AfxOleInit() ,但是都没写清楚在哪里调用,也说不出理由

http://blog.csdn.net/bengold1979/article/details/2583307这里简单说了一下,但是我不太同意他的说话

于是又找到下面的文章

http://hi.baidu.com/tdd09/blog/item/fc1341521693c26c853524e9.html

 

使用第2中方法确实解决了问题,我原来的创建方法用的是MSDN上的例子

CFileDialog fileDlg (TRUE, "my", "*.my", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

程序段结束的时候就出问题,也就是该销毁变量的时候出问题。反正自己构建就能解决。

 

(1)CoInitializeEx(0, COINIT_MULTITHREADED);与CFileDialog冲突 会导致CFileDialog打开的对话框中“我的电脑”出现白板。
解决:最后是两者不要放在同一个线程中。也可以将CoInitialize(NULL)替换CoInitializeEx(0, COINIT_MULTITHREADED);
(2)有时调用CFileDialog会出现:Unhandledexception in *.exe (KERNEL32.dll)0xc0000005:Access Violation的错误框。 并且CFileDialog对话框对象会(当时的返回值显示 m_filedialog {CFileDialog hWnd=0x00000000})
这个时候处理方法就是自己new出一个CFileDialog:
CFileDialog *dlg = new CFileDialog(TRUE,0,0, OFN_HIDEREADONLY,filter);
if(dlg) delete [] dlg ;

 

还有个经验 atoi 函数在不能转换的时候并不报错直接返回0,所以无法使用try来判断

posted on 2020-11-19 11:27  大湾  阅读(993)  评论(0编辑  收藏  举报

导航