在CFileDialog类封装Windows通用文件对话框。常见的文件对话框中提供一种简单的方法来实现为对话框(以及其他文件选择对话框文件打开和保存文件)的方式与Windows标准一致。
你可以使用CFileDialog的“现况”提供的构造,或者你可以从CFileDialog的你自己写一个对话框类和构造,以满足您的需求。在这两种情况下,这些对话框将像标准的Microsoft基础类的对话框,因为他们是从CCommonDialog类派生。
要使用CFileDialog对象,首先创建对象使用CFileDialog的构造函数。对话框后已建成,你可以设置或修改m_ofn结构中的任何值初始化的值或对话框的控制状态。该m_ofn结构类型OPENFILENAME。欲了解更多信息,请参见Platform SDK中的OPENFILENAME结构。
初始化后,对话框的控件,调用成员函数调用DoModal显示对话框,并允许用户输入的路径和文件。用户是否选择了行(IDOK)或取消(IDCANCEL)按钮调用DoModal返回。
如果调用DoModal返回IDOK,你可以使用CFileDialog的公共成员函数来检索一个由用户输入的信息。
CFileDialog的包括一些受保护的成员,使你做的分享行为,验证自定义处理文件名和列表框更改通知。这些受保护的成员是回调函数,大多数应用程序不需要使用,因为默认的处理是自动完成的。这些函数消息映射项是没有必要,因为他们是标准的虚函数。
你可以使用Windows CommDlgExtendedError函数来确定是否有错误发生在对话框的初始化和了解更多的错误。
在CFileDialog的对象自动销毁处理。这是没有必要调用CDialog的::EndDialog中、
为了让用户选择多个文件,调用DoModal之前设置的OFN_ALLOWMULTISELECT标志。您需要提供您自己的文件名的缓冲区,以容纳多个文件名返回的列表。做到这一点,以取代你有一个分配的缓冲区指针m_ofn.lpstrFile,后建设CFileDialog的,但之前调用DoModal。此外,您必须设置的缓冲区中的字符数m_ofn.nMaxFile所指向m_ofn.lpstrFile。
CFileDialog的依赖COMMDLG.DLL文件随Windows版本3.1和更高版本。
如果你得到一个从CFileDialog的新的类,你可以使用一个消息映射处理任何消息。为了扩大默认消息处理,从CWnd派生一个类,添加消息映射到新的类,并为新邮件的成员函数。您不必提供一个钩子函数自定义对话框。
函数原型:
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 );
bOpenFileDialog:设置为TRUE,构建一个文件打开对话框或FALSE建设作为一个文件保存对话框。
lpszDefExt:默认的文件扩展名。如果用户不包括在文件扩展名编辑框,延长指定lpszDefExt自动追加到文件名。如果这个参数为NULL,没有文件扩展名被追加。
lpszFileName: 最初的文件名,文件名出现在编辑框中。 如果为NULL,没有文件名最初出现。
dwFlags:一个或多个标记,允许您自定义对话框的组合。有关这些标志说明,请参见Platform SDK中的OPENFILENAME结构。如果您修改m_ofn.Flags结构成员,使用您的变更1位或经营者保持默认行为保持不变。
lpszFilter:一个数组对一系列指定过滤器可以应用到该文件。如果指定的文件过滤器,只选定的文件将显示在文件列表框。如需关于如何使用文件过滤器的信息备注一节。
pParentWnd:一到文件对话框框对象的父母或所有者窗口的指针。
dwSize:在OPENFILENAME结构的大小。此值是操作系统的版本有关,所以MFC可以判断对话创造合适的种类(例如,新的Windows 2000 NT4的对话,而不是对话)。
备注
无论是打开文件或文件另存为对话框构造,取决于bOpenFileDialog的值。
为了让用户选择多个文件,调用DoModal之前设置的OFN_ALLOWMULTISELECT标志。您需要提供您自己的文件名的缓冲区,以容纳多个文件名返回的列表。做到这一点,以取代你有一个分配的缓冲区指针m_ofn.lpstrFile,后建设CFileDialog的,但之前调用DoModal。此外,您必须设置的缓冲区中的字符数m_ofn.nMaxFile所指向m_ofn.lpstrFile。
为了让用户能够调整一个资源管理器风格的对话框中使用鼠标或键盘,设置OFN_ENABLESIZING标志。设置这个标志,如果你只需要提供一个钩子程序或定制模板。该标志只适用于一个资源管理器风格的对话框;旧式的对话框不允许调整大小。
该lpszFilter参数是用来确定文件名键入一个文件必须要在文件列表框中显示。字符串中的第一个字符串描述了一对滤波器;第二个字符串表示文件扩展名使用。可以指定多个扩展名用';'作为分隔符。该字符串两端有两个'|'字符,然后由一个NULL字符。您也可以使用这个参数一个CString对象。
例如,Microsoft Excel中允许用户打开的扩展。XLC配置(图表)或文件的。xls(工作表)等。 Excel的过滤器可以写成:
static char BASED_CODE szFilter[] = "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
但是请注意,如果你打算使用此字符串直接更新OPENFILENAME结构,你应该用空字符分隔的字符串,'/ 0',而不是(|)竖线。
----------------------------------------------------------------------------------------------------------------------------------------------------
返回值
该文件的完整路径。
备注
文件名的路径,包括文件的整个目录的路径加上标题。例如,GetPathName将返回的“C:/文件/ TEXT.DAT”的文件C:/文件/ TEXT.DAT。
如果m_ofn.Flags有OFN_ALLOWMULTISELECT标志设置,此字符串包含一个空teminated字符串序列,第一个是选择的文件组中,由用户选择的所有文件的名称后的目录路径字符串。基于这个原因,使用GetStartPosition和GetNextPathName成员函数来检索列表中的下一个文件的名称。
----------------------------------------------------------------------------------------------------------------------------------------------------
CFileDialog::GetFileName
调用此函数来检索在对话框中输入文件名的名称。
CString GetFileName( ) const;
返回值
该文件的名称
备注
该文件的名称既包括前缀和扩展。例如,GetFileName将返回“TEXT.DAT”的文件C:/文件/ TEXT.DAT。
如果m_ofn.Flags有OFN_ALLOWMULTISELECT标志设置,你应该调用GetStartPosition和GetNextPathName检索一个文件路径名。
----------------------------------------------------------------------------------------------------------------------------------------------------
CFileDialog::DoModal
CFileDialog的概况|类成员|层次图| CDialog的::调用DoModal | CFileDialog的::CFileDialog的
调用此函数来显示Windows通用文件对话框,允许用户浏览文件和目录,并输入一个文件名
返回值
IDOK或IDCANCEL。如果IDCANCEL返回,调用Windows CommDlgExtendedError函数来确定是否发生错误。
IDOK和IDCANCEL都是常量,指示用户是否选择确定或取消按钮。
备注
如果你想要初始化的各种文件对话框中通过设置m_ofn结构成员的选择,你应该做之前调用DoModal这一点,但在该对话框对象构造。
当用户点击对话框的确定或取消按钮,或选择从对话框的控件菜单关闭选项,控制返回到应用程序。然后,可以调用其他成员函数来检索到对话框中的设置或用户输入的信息。
虚函数调用DoModal是从类CDialog的覆盖。
void CChildFrame::OnFileOpen() { // szFilters is a text string that includes two file name filters: // "*.my" for "MyType Files" and "*.*' for "All Files." char CChildFrame::szFilters[]= "MyType Files (*.my)|*.my|All Files (*.*)|*.*||"; // Create an Open dialog; the default file name extension is ".my". CFileDialog fileDlg (TRUE, "my", "*.my", OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this); // Display the file dialog. When user clicks OK, fileDlg.DoModal() // returns IDOK. if( fileDlg.DoModal ()==IDOK ) { CString pathName = fileDlg.GetPathName(); // Implement opening and reading file in here. ... //Change the window's title to the opened file's title. CString fileName = fileDlg.GetFileTitle (); SetWindowText(fileName); } }