VS2010/MFC入门编程九(对话框:文件对话框的操作)

文件对话框的分类
      文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框。例如,很多编辑软件像记事本等都有“打开”选项,选择“打开”后会弹出一个对话框,让我们选择要打开文件的路径,这个对话框就是打开文件对话框;除了“打开”选项一般还会有“另存为”选项,选择“另存为”后往往也会有一个对话框弹出,让我们选择保存路径,这就是保存文件对话框。正如上面举例说明的,打开文件对话框用于选择要打开的文件的路径,保存文件对话框用来选择要保存的文件的路径。


 文件对话框类CFileDialog


MFC使用文件对话框类CFileDialog封装了对文件对话框的操作。CFileDialog类的构造函数原型如下:

explicit CFileDialog(
   BOOL bOpenFileDialog,
   LPCTSTR lpszDefExt = NULL,
   LPCTSTR lpszFileName = NULL,
   DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
   LPCTSTR lpszFilter = NULL,
   CWnd* pParentWnd = NULL,
   DWORD dwSize = 0,
   BOOL bVistaStyle = TRUE
);


 

       参数说明:
       bOpenFileDialog:指定要创建的文件对话框的类型。设为TRUE将创建打开文件对话框,否则将创建保存文件对话框。


       lpszDefExt:默认的文件扩展名。如果用户在文件名编辑框中没有输入扩展名,则由lpszDefExt指定的扩展名将被自动添加到文件名后。默认为NULL。


       lpszFileName:文件名编辑框中显示的初始文件名。如果为NULL,则不显示初始文件名。


       dwFlags:文件对话框的属性,可以是一个值也可以是多个值的组合。关于属性值的定义,可以在MSDN中查找结构体OPENFILENAME,元素Flags的说明中包含了所有属性值。默认为OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的组合,OFN_HIDEREADONLY表示隐藏文件对话框上的“Read Only”复选框,OFN_OVERWRITEPROMPT表示在保存文件对话框中如果你选择的文件存在了,就弹出一个消息对话框,要求确定是否要覆盖此文件。


       lpszFilter:文件过滤器,它是由若干字符串对组成的一个字符串序列。如果指定了文件过滤器,则文件对话框中只有符合过滤条件的文件显示在文件列表中待选择。给大家看看VS2010 MSDN中给出的一个例子:


       static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||");
       这样设置过滤器以后,文件对话框的扩展名组合框中将有四个选项:Chart Files (*.xlc)、Worksheet Files (*.xls)、Data Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每种文件的扩展名规定都是一个字符串对,例如Chart Files的过滤字符串是Chart Files(*.xlc)和*.xlc成对出现的。


       pParentWnd:文件对话框的父窗口的指针。


       dwSize:OPENFILENAME结构体的大小。不同的操作系统对应不同的dwSize值。MFC通过此参数决定文件对话框的适当类型(例如,创建Windows 2000文件对话框还是XP文件对话框)。默认为0,表示MFC将根据程序运行的操作系统版本来决定使用哪种文件对话框。


       bVistaStyle:指定文件对话框的风格,设为TRUE则使用Vista风格的文件对话框,否则使用旧版本的文件对话框。此参数仅在Windows Vista中编译时适用。


       文件对话框也是模态对话框,所以在打开时也需要调用CFileDialog类的DoModal()成员函数。在打开文件对话框中点了“打开”或者在保存文件对话框中点了“保存”以后,我们可以使用CFileDialog类的成员函数GetPathName()获取选择的文件路径。


       下面列出几个CFileDialog类的成员函数,我们可以使用它们获得文件对话框中的各种选择。

GetFileExt()://获得选定文件的后缀名。
GetFileName()://获得选定文件的名称,包括后缀名。
GetFileTitle()://获得选定文件的标题,即不包括后缀名。
GetFolderPath()://获得选定文件的目录。
GetNextPathName()://获得下一个选定的文件的路径全名。
GetPathName()://获得选定文件的路径全名。
GetReadOnlyPref()://获得是否“以只读方式打开”。
GetStartPosition()://获得文件名列表中的第一个元素的位置。


 


文件对话框实例

 

新建VS2010/MFC 基于 Dialog工程

 


  2.删除自动生成的“TODO: Place dialog controls here.”静态文本框,添加两个编辑框,ID分别为IDC_OPEN_EDIT和IDC_SAVE_EDIT,再添加两个按钮,ID分别设为IDC_OPEN_BUTTON和IDC_SAVE_BUTTON,Caption分别设为“打开”和“保存”。按钮IDC_OPEN_BUTTON用于显示打开文件对话框,编辑框IDC_OPEN_EDIT显示在打开文件对话框中选择的文件路径。按钮IDC_SAVE_BUTTON用于显示保存文件对话框,编辑框IDC_SAVE_BUTTON显示在保存文件对话框中选择的文件路径。
       3.分别为按钮IDC_OPEN_BUTTON和IDC_SAVE_BUTTON添加点击消息的消息处理函数CTestDlg::OnBnClickedOpenButton()和CTestDlg::OnBnClickedSaveButton()。

<pre class="cpp" name="code">void CTestDlg::OnBnClickedOpenButton()
{
	// TODO: Add your control notification handler code here   
    	// 设置过滤器   
    	TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");   
    	// 构造打开文件对话框   
    	CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);   
    	CString strFilePath;   
  
    	// 显示打开文件对话框   
    	if (IDOK == fileDlg.DoModal())   
    	{   
        		// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
        		strFilePath = fileDlg.GetPathName();   
        		SetDlgItemText(IDC_OPEN_EDIT, strFilePath);   
   	}   

}


void CTestDlg::OnBnClickedSaveButton()
{
	// TODO: Add your control notification handler code here
	
	// 设置过滤器   
    	TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");   
    	// 构造保存文件对话框   
   	CFileDialog fileDlg(FALSE, _T("doc"), _T("my"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);   
    	CString strFilePath;   
  
    	// 显示保存文件对话框   
    	if (IDOK == fileDlg.DoModal())   
    	{   
        		// 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里   
        		strFilePath = fileDlg.GetPathName();   
        		SetDlgItemText(IDC_SAVE_EDIT, strFilePath);   
    	}   
}

void CTestDlg::OnBnClickedOpenButton()
{
// TODO: Add your control notification handler code here
	TCHAR	szFolderPath[MAX_PATH] = {0};
	CString	strFolderPath = TEXT(""); 
	BROWSEINFO sInfo;
	::ZeroMemory(&sInfo, sizeof(BROWSEINFO));  
	sInfo.pidlRoot   = 0;
	sInfo.lpszTitle   = _T("请选择处理结果存储路径");
	sInfo.ulFlags   = BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_DONTGOBELOWDOMAIN;
	sInfo.lpfn     = NULL;
	// 显示文件夹选择对话框
	LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
	if (lpidlBrowse != NULL)
	{
		// 取得文件夹名  
		if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))   
		{
			strFolderPath = szFolderPath;
		} 
	}
	if(lpidlBrowse != NULL)  
	{
		::CoTaskMemFree(lpidlBrowse); 
	}
	//return strFolderPath;
} 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值