最近要做一個文件打開和保存的對話框,現將相關的代碼記錄如下,用以備忘!
所用控件:
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來判斷