(6)MFC——文件打開和保存對話框(CFileDialog)


最近要做一個文件打開和保存的對話框,現將相關的代碼記錄如下,用以備忘!

所用控件:

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來判斷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM