在MFC中如何選擇檔名和資料夾
選擇資料夾
MFC提供開啟檔案對話方塊可以選擇檔名,如果想選擇目錄的話,就不能使用CFileDialog,實現過程如下:
CStringsFolderPath;
BROWSEINFO bi;
TCHAR Buffer[MAX_PATH];
//初始化入口引數bi開始
bi.hwndOwner = NULL;
bi.pidlRoot =NULL;//初始化制定的root目錄很不容易,
bi.pszDisplayName = Buffer;//此引數如為NULL則不能顯示對話方塊
bi.lpszTitle = tittle;
//bi.ulFlags = BIF_BROWSEINCLUDEFILES;//包括檔案
bi.ulFlags = BIF_EDITBOX;//包括檔案
bi.lpfn = NULL;
bi.iImage=IDR_MAINFRAME;
//初始化入口引數bi結束
LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//呼叫顯示選擇對話方塊
if(pIDList)
{
SHGetPathFromIDList(pIDList, Buffer);
//取得資料夾路徑到Buffer裡
sFolderPath = Buffer;//將路徑儲存在一個CString物件裡
}
選擇檔名
CFileDialog檔案選擇對話方塊的使用:首先構造一個物件並提供相應的引數,建構函式原型如下:
CFileDialog::CFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter =NULL, CWnd* pParentWnd = NULL );
引數意義如下:
bOpenFileDialog 為TRUE則顯示開啟對話方塊,為FALSE則顯示儲存對話檔案對話方塊。
lpszDefExt 指定預設的副檔名。
lpszFileName 指定預設的檔名。
dwFlags 指明一些特定風格。
OFN_HIDEREADONLY:隱藏只讀選項
OFN_OVERWRITEPROMPT:覆蓋已有檔案前提
OFN_ALLOWMULTISELECT:允許選擇多個檔案
OFN_CREATEPROMPT:如果輸入的檔名不存在,則對話方塊返回詢問使用者是否根據次檔名建立檔案的訊息框
OFN_FILEMUSTEXIST:只能輸入已存在的檔名
OFN_FORCESHOWHIDDEN:可以顯示隱藏的檔案
OFN_NOREADONLYRETURN:不返回只讀檔案
OFN_OVERWRITEPROMPT:儲存的檔案已存在時,顯示檔案已存在的資訊
lpszFilter 是最重要的一個引數,它指明可供選擇的檔案型別和相應的副檔名。引數格式如:
"ChartFiles (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";檔案型別說明和副檔名間用 | 分隔,同種型別檔案的副檔名間可以用 ; 分割,每種檔案型別間用 | 分隔,末尾用 || 指明。
pParentWnd 為父視窗指標。
對話方塊選項常用屬性(例項:dialog)
dialog.m_ofn.lpstrTitle:顯示視窗標題。
dialog.m_ofn.lpstrInitialDir:初始化展開路徑。
dlg.m_ofn.lpstrFile:預設檔案
dlg.m_ofn.lpstrFilter:檔案篩選型別,注意與lpszFilter區別,要用"\0",不能用"|"
如:dlg.m_ofn.lpstrFilter="所有檔案\0*.*\0影象檔案\0*.jpg;*.bmp;*.gif\0\0";
建立檔案對話方塊可以使用DoModal(),在返回後可以利用下面的函式得到使用者選擇:
CStringCFileDialog::GetPathName( ) 得到完整的檔名,包括目錄名和副檔名如:c:testtest1.txt
CStringCFileDialog::GetFileName( ) 得到完整的檔名,包括副檔名如:test1.txt
CStringCFileDialog::GetExtName( ) 得到完整的副檔名,如:txt
CStringCFileDialog::GetFileTitle ( ) 得到完整的檔名,不包括目錄名和副檔名如:test1
POSITIONCFileDialog::GetStartPosition( ) 對於選擇了多個檔案的情況得到第一個檔案位置。
CString CFileDialog::GetNextPathName(POSITION& pos ) 對於選擇了多個檔案的情況得到下一個檔案位置,並同時返回當前檔名。但必須已經呼叫過POSITION CFileDialog::GetStartPosition( )來得到最初的POSITION變數。
例:
CFileDialogGetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,"Microsoft Excel(*.xls)|*.xls|AllFiles(*.*)|*.*");
CFileDialogGetFile(開啟檔案對話方塊(TRUE),副檔名(NULL),檔名(NULL),風格-檔案必須存在(OFN_FILEMUSTEXIST),檢視檔案型別-EXCEL檔案,所有檔案(Microsoft Excel(*.xls)|*.xls|All Files(*.*)|*.*);
選擇多個檔案示例:
CFileDialogopenDlg( TRUE, /*bOpenFileDialog=TRUE時開啟檔案,為FALSE時儲存檔案*/
NULL,
NULL,
OFN_ALLOWMULTISELECT, /*dwFlags為OFN_ALLOWMULTISELECT表示可以選擇多個檔案*/);
//構建CFielDialog物件時指定了OFN_ALLOWMULTISELECT的情況下,需要在物件DoModal()函式返回之前需要指定足夠大
//的記憶體空間來存放檔名.如果選擇的多個檔名組成的字串長度大於指定的記憶體空間是就會導致DoModal()返回IDCANCEL.
/*申請記憶體來存放多個檔名組成的字串*/
const intnMaxFiles = 1000;
const intnMaxPathBuffer = (nMaxFiles * (MAX_PATH + 1)) + 1;
LPWSTR pc =(LPWSTR)malloc(nMaxPathBuffer * sizeof(WCHAR));
if( pc )
{
openDlg.GetOFN().lpstrFile = pc;
openDlg.GetOFN().lpstrFile[0] = NULL;
openDlg.nMaxFile = nMaxPathBuffer;
if( openDlg.DoModal() == IDOK )
{
POSITION posStart =openDlg.GetStartPosition();
while( posStart )
{
//從pc所指向的記憶體中解析出每個檔案的名字,這裡的fileName所佔的記憶體不能和pc所佔的記憶體發生衝突
CString fileName =openDlg.GetNextPathName();
// pathName= fileDlg.GetNextPathName(pos_file);
}
}
free(pc);
}