文件打开对话框

  CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。

  1 要使用CFileDialog,先用CFileDialog构造函数构造一个对象,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则显示保存文件对话框
  • lpszFileName 指定默认的文件名。
  • dwFlags 指明一些特定风格。
  • lpszFilter 是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。参数格式如:
  "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
  文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
  • pParentWnd 为父窗口指针。

  2  当创建了一个对话框后,可以设置或修改m_ofn结构中的任何值,以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的

typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;

  具体信息请看百度百科http://baike.baidu.com/link?url=NIYFyOpTc_eTI8YwIHH6jjjSwUH3KEWo1x4GLQfQxrKML9IgLvv-aMxOnoQMCJ8VOh2V5iG7lsqqyTI_Gc6Ai_

  3 初始化对话框控件后,调用DoModal成员函数显示对话框并使用户输入路径和文件。当DoModal返回IDOK,可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。

CFileDialog   //构造一个CFileDialog对象操作
DoModal       //显示对话框并使用户可以进行选择
GetPathName   //返回选定文件的完整路径
GetFileName    //返回选定文件的文件名
GetFileExt     //返回选定文件的扩展文件名
GetFileTitle   //返回选定文件的标题
GetNextPathName  //返回下一个选定文件的完整路径
GetReadOnlyPref   //返回选定文件的只读状态
GetStartPosition   //返回文件名列表的第一个元素位置覆盖的函数
假如选择的文件是C:WINDOWSTEST.EXE
则:
(1)GetPathName();取文件名全称,包括完整路径。取回C:WINDOWSTEST.EXE
(2)GetFileName();取文件全名:TEST.EXE
(3)GetFileTitle();取回TEST
(4)GetFileExt();取扩展名EXE
补充: 在控制台下使用这个类需要设置在静态库中使用MFC,然后构造 AfxSetResourceHandle(GetModuleHandle(NULL));
4 析构一个CFileDialog对象是自动,无须调用CDialog::EndDialog
5 要使用户选用多个文件,可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表,这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现,要在创建了CFileDialog之后调用DoModal之前进行此操作。另外,必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile

        实例代码如下,打开初始目录为C盘,选择其中的图片文件:

BOOL COpenFileDlgDlg::OnInitDialog()
{
....

    TCHAR fileter[] = _T("图像(*.bmp;*.tif;*.jpg;*.JEPG) | *.bmp; *.tif; *.jpg;*.JEPG | All Files(*.*) | *.* ||");

    //文件对话框
    CFileDialog fdlg(true, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, fileter);

    //设置初始文件目录
    fdlg.m_ofn.lpstrInitialDir = _T("c:\");

    //弹出对话框,如果点击OK
    if(fdlg.DoModal() == IDOK)
    {
        //获取打开文件的文件名
        CString fileName = fdlg.GetPathName();

        CString tip("当前打开的文件名为:");
        tip += fileName;
   
        MessageBox(tip.GetString(),NULL, MB_OK);
    }
....
}
原文地址:https://www.cnblogs.com/1314NNNKKK/p/3479240.html