MFC 使用對話框裏面打開多個文件

在使用的時候,用一個數組開闢一個大的空間,保存文件的路徑,然後在其他地方使用CVLOADIMAGE來載入圖片,但是也可以使用CFileDialog的一個成員變量中取出。使用中出現的問題有

1.在對話框的m_ofn的設置的時候

dlg.m_ofn.Flags=OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLEHOOK;//改變對話框的樣式,注意的是最後一個OFN_ENABLEHOOK必須加上去

不然就會出錯了

2.空間的開闢足夠大以及初始化爲空

 

 

在MFC中使用CFile類和CFileDialog可以很簡單的載入和保存文件……

CFileDialog文件選擇對話框的使用:
首先構造一個對象並提供相應的參數,構造函數原型如下:
CFileDialog::CFileDialog(
BOOL bOpenFileDialog, //爲TRUE則顯示打開對話框,爲FALSE則顯示保存對話文件對話框
LPCTSTR lpszDefExt = NULL, //默認的文件擴展名
LPCTSTR lpszFileName = NULL, //默認的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //設定風格
LPCTSTR lpszFilter = NULL, //列出可供選擇的文件類型和相應的擴展名
CWnd* pParentWnd = NULL //父窗口句柄指針
);
 
LPCTSTR lpszFilter 參數格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件類型說明和擴展名間用 | 分隔,同種類型文件的擴展名間可以用 ; 分割,每種文件類型間用 | 分隔,末尾用 || 指明。

創建文件對話框可以使用DoModal(),在返回後可以利用下面的函數得到用戶選擇:
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目錄名和擴展名如:c:\test\test1.txt
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括擴展名如:test1.txt
CString CFileDialog::GetExtName( ) 得到完整的文件擴展名,如:txt
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目錄名和擴展名如:test1
POSITION CFileDialog::GetStartPosition( ) 對於選擇了多個文件的情況得到第一個文件位置。
CString CFileDialog::GetNextPathName( POSITION& pos ) 對於選擇了多個文件的情況得到下一個文件位置,並同時返回當前文件名。但必須已經調用過POSITION CFileDialog::GetStartPosition( )來得到最初的POSITION變量。

下面是實現代碼:
//打開文件
//創建文件名緩存(fileBuffer)和文件讀取緩存(rBuffer)
//此處如果不把緩存置0,在後面的設定中就會出錯,如果是動態申請的,請用memset或者for循環把數組清零
char fileBuffer[5010] = {0}, rBuffer[5010] = {0};
int rBSize;
//定義一個CFile類,用來處理文件
CFile in;
//定義一個CFileDialog類,用來顯示標準的打開文件對話框
CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T("自定義文件類型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
inDlg.m_ofn.lpstrTitle = _T("打開自定義文件");
//設定一個文件名緩存,因爲CFileDialog內置的文件名緩存長度只有200,但是很多時候,文件的路徑遠大於這個數,爲了保險起見,所以要自己設定一個文件名緩存
inDlg.m_ofn.lpstrFile = fileBuffer;
//設定緩存長度
inDlg.m_ofn.nMaxFile = 5000;
//顯示對話框,並處理按了確定按鈕的事件
if(inDlg.DoModal() == IDOK) {
 //以只讀方式打開文件
 if(in.Open(inDlg.GetPathName(), CFile::modeRead)) {
  //得到文件長度,從而確定讀取緩存的大小
  rBSize = in.GetLength();
  //避免數組越界,當然在這裏也可以動態申請緩存空間
  if(rBSize > 5000) rBSize = 5000;
  //讀入數據
  n.Read(rBuffer, rBSize);
  //關閉文件
  in.Close();
  MessageBox("打開文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
 } else {
  MessageBox("打開文件失敗", "失敗了", MB_ICONSTOP | MB_OK);
 }
}

//保存文件
//創建文件名緩存(fileBuffer)和文件寫入緩存(wBuffer)
//此處如果不把緩存置0,在後面的設定中就會出錯,如果是動態申請的,請用memset或者for循環把數組清零
char fileBuffer[5010] = {0}, wBuffer[5010] = {0};
int wBSize;
CFile out;
CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T("自定義文件類型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
//設定保存對話框標題
outDlg.m_ofn.lpstrTitle = _T("保存自定義文件");
//使用自定義的文件名緩存
outDlg.m_ofn.lpstrFile = fileBuffer;
//設定保存文件的默認後綴,如果自己有輸入後綴,則時候輸入的後綴
outDlg.m_ofn.lpstrDefExt = "xxx";
//設定緩存大小
outDlg.m_ofn.nMaxFile = 5000;
//顯示對話框
if(outDlg.DoModal() == IDOK) {
 //得到文件名,並用創建和寫入方式打開
 if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) {
  //在這裏把你要寫入文件的內容寫入緩存,如果寫入的內容過長,可以分次寫入
  //得到寫入當前緩存中內容的長度
  wBSize = strlen(wBuffer);
  //寫入文件
  out.Write(wBuffer, wBSize);
  //關閉文件
  out.Close();
  MessageBox("保存文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
 } else {
  MessageBox("保存文件失敗", "失敗了", MB_ICONSTOP | MB_OK);
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章