关于MFC文件打开对话框与保存对话框,打开文件夹的整理

     在windows 系统下常常可以看到文件的打开,另存为,文件夹打开等对话框,本次将会整理这些方法。常见的打开文件对话框方法有两种:CFileDialog和OPENFILENAMEA,前者是文件对话框类,后者是一个结构体;前者需要加入#include <afxdlgs.h>头文件,后者需要引入头文件#include “commdlg.h”,当然这指的是C++控制台中的调用,MFC中则可以忽略。

1.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

扫描二维码关注公众号,回复: 16277471 查看本文章

指定默认的文件扩展名。 
  lpszFileName

指定默认的文件名。 
  dwFlags

指明一些特定风格。 
  lpszFilter

是最重要的一个参数,它指明可供选择的文件类型和相应的扩展名。

pParentWnd

为父窗口指针。

(1)打开文件对话框

egg:

   TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");
    // 构造打开文件对话框   
    CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
    CString strFilePath;

    // 显示打开文件对话框   
    if (IDOK == fileDlg.DoModal())
    {
        // 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径显示到编辑框里   
        strFilePath = fileDlg.GetPathName();
        SetDlgItemText(IDC_EDIT_PATH, strFilePath);
    }

(2)另存为对话框

egg:

   TCHAR szFilter[] = _T("文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|所有文件(*.*)|*.*||");
    // 构造保存文件对话框   
    CFileDialog fileDlg(FALSE, _T("doc"), _T("test"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);
    CString strFilePath;

    // 显示保存文件对话框   
    if (IDOK == fileDlg.DoModal())
    {
        // 如果点击了文件对话框上的“保存”按钮,则将选择的文件路径显示到编辑框里   
        strFilePath = fileDlg.GetPathName();
        SetDlgItemText(IDC_EDIT_SAVE, strFilePath);
    }

2.OPENFILENAMEA结构体

OPENFILENAME结构包含了GetOpenFileNameGetSaveFileName函数用来初始化打开或另存为对话框的信息。在用户关闭对话框后,系统返回关于用户的选择信息到这个结构中。

结构体原型:

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;

'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0

筛选字符串中也可以同时指定多个扩展名,中间用分号隔开,如'*.txt;*.doc'。

lpstrFile――指向一个包含文件名的缓冲区。如果这个缓冲区中已经包含了一个文件名,那么对话框初始化的时候将显示这个文件名。当用户选择了一个文件的时候,函数在这里返回新的文件名。

nMaxFile――指定lpstrFile参数指向的缓冲区的长度。

lpstrFileTitle――指向一个缓冲区,用来接收用户选择的不含路径的文件名。这个字段可以为NULL。

nMaxFileTitle――指明lpstrFileTitle参数指向的缓冲区的长度。

lpstrInitialDir――对话框的初始化目录,这个字段可以为NULL。

lpstrTitle――指向自定义的对话框标题,如果这个字段是NULL,那么“打开”对话框和“保存”对话框的默认标题是“打开”和“另存为”。

nFileOffset―返回文件名字符串中文件名的起始位置,如当用户选择了文件“c:\dir1\file.ext”时,这里将返回8。

nFileExtension――返回文件名字符串中扩展名的起始位置,同样是上面的字符串,这里返回13。如果文件名的最后一个字符是“.”,这里返回0,表示文件没有扩展名,这个字段和nFileOffset字段为分析文件名提供了方便。

lpstrDefExt――指定默认扩展名,如果用户输入了一个没有扩展名的文件名,那么函数会自动加上这个默认扩展名。

Flags字段――该标志字段决定了对话框的不同行为,它可以是一些取值的组合。下面是一些比较重要的标志:

OFN_ALLOWMULTISELECT――允许同时选择多个文件名。

OFN_CREATEPROMPT――如果用户输入了一个不存在的文件名,对话框向用户提问“是否建立文件”。

OFN_FILEMUSTEXIST――用户只能选择一个已经存在的文件名,使用这个标志的时候必须同时使用 OFN_PATHMUSTEXIST标志。

OFN_HIDEREADONLY――对话框中不显示“以只读方式打开”复选框。

OFN_OVERWRITEPROMPT――在“保存”文件对话框中使用的时候,当选择一个已存在的文件时,对话框会提问“是否覆盖文件”。

OFN_PATHMUSTEXIST――用户输入文件名时,路径必须存在。

OFN_READONLY――对话框中的“以只读方式打开”复选框初始化的时候处于选中状态。

调用显示“打开”或“保存”文件对话框函数时,函数会停留直到对话框关闭为止,当用户单击了对话框中的“确 定”按钮时,函数返回TRUE,用户单击“取消”按钮退出时,函数返回FALSE,程序可以由此判断是否需要继续进行打开或保存文件的操作。 

egg:

    OPENFILENAMEA ofn;
    char szFile[260];
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "文本文件(*.txt)\0*.txt\0Word文件(*.doc)\0*.doc\0所有文件(*.*)\0*.*\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = 0;

    if (GetOpenFileNameA(&ofn) == FALSE)
    {
        return;
    }
    CString str_path = (CString)ofn.lpstrFile;
    SetDlgItemText(IDC_EDIT_PATH, str_path);

3.文件夹打开对话框

需引入头文件:#include "Shlobj.h"

函数原型:

typedef struct_browseinfo

{

HWND hwndOwner;

LPCITEMIDLIST pidlRoot;

LPSTR pszDisplayName;

LPCSTR lpszTitle;

UINT ulFlags;

BFFCALLBACK lpfn;

LPARAM lParam;

int iImage;

}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;

参数含义:

hwndOwner:浏览文件夹对话框的父窗体句柄。

pidlRoot:ITEMIDLIST结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览文件夹对话框中。该成员变量可以是NULL,在此时桌面目录将被使用。

pszDisplayName:用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。

lpszTitle:该浏览文件夹对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。

ulFlags:该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合:

BIF_BROWSEFORCOMPUTER:返回计算机名。除非用户选中浏览器中的一个计算机名,否则该对话框中的“OK”按钮为灰色。

BIF_BROWSEFORPRINTER:返回打印机名。除非选中一个打印机名,否则“OK”按钮为灰色。

BIF_BROWSEINCLUDEFILES:浏览器将显示目录,同时也显示文件。

BIF_DONTGOBELOWDOMAIN:在树形视窗中,不包含域名底下的网络目录结构。

BIF_EDITBOX:浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。

BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。

BIF_RETURNONLYFSDIRS:仅仅返回文件系统的目录。例如:在浏览文件夹对话框中,当选中任意一个目录时,该“OK”按钮可用,而当选中“我的电脑”或“网上邻居”等非有意义的节点时,“OK”按钮为灰色。

BIF_STATUSTEXT:在对话框中包含一个状态区域。通过给对话框发送消息使回调函数设置状态文本。

BIF_VALIDATE:当没有BIF_EDITBOX标志位时,该标志位被忽略。如果用户在编辑框中输入的名字非法,浏览对话框将发送BFFM_VALIDATEFAILED消息给回调函数。

lpfn:应用程序定义的浏览对话框回调函数的地址。当对话框中的事件发生时,该对话框将调用回调函数。该参数可用为NULL。

lParam:对话框传递给回调函数的一个参数指针

iImage:与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。

egg:

    TCHAR tszBuffer[MAX_PATH] = { 0 };
    BROWSEINFO bi;
    ZeroMemory(&bi, sizeof(BROWSEINFO));
    bi.hwndOwner = NULL;
    bi.pszDisplayName = tszBuffer;
    bi.lpszTitle = _T("请从下面选文件夹目录:");
    bi.ulFlags = BIF_RETURNFSANCESTORS;
    LPITEMIDLIST idl = SHBrowseForFolder(&bi);
    if (NULL == idl)
    {
        return;
    }
    SHGetPathFromIDList(idl, tszBuffer);
    SetDlgItemText(IDC_EDIT_SCAN, tszBuffer);

好了,整理完了,此文章主要作为笔记来用来以后翻看用,不做别的用途,同时也供大家查看。

猜你喜欢

转载自blog.csdn.net/leiyang2014/article/details/86677865