您的位置:首页 > 其它

[Win32]打开文件/保存文件/选择文件夹对话框

2015-08-12 17:31 639 查看
本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:/article/9672531.html
1。打开文件对话框:GetOpenFileName函数

BOOL WINAPI GetOpenFileName(
_Inout_ LPOPENFILENAME lpofn
);

参数:一个指向 OPENFILENAME 结构的指针,其中包含用于初始化对话框的信息。GetOpenFileName 返回时,此结构包含有关用户的文件选择的信息。

返回值:如果用户指定的文件名,并单击确定按钮,返回值不为零。指向的 OPENFILENAME 结构的 lpstrFile 成员在缓冲区中包含完整的路径和文件名称。如果用户取消或关闭打开对话框或发生错误,则返回值为零。
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
} OPENFILENAME, *LPOPENFILENAME;


lStructSize:结构的长度,以字节为单位。此参数使用 sizeof (OPENFILENAME)。
hwndOwner:拥有该对话框的窗口的句柄。这个成员可以是任何有效的窗口句柄。如果对话框里有没有所有者,它可以为 NULL。
lpstrFilter:包含对 null 终止的筛选器字符串的缓冲区。缓冲区中的最后一个字符串必须以两个空字符终止。
每一对中的第一个字符串是一个显示字符串,描述了该筛选器 (例如,"文本文件"),和第二个字符串指定筛选器模式 (例如,"*.TXT")。若要指定多个筛选器模式为单显示字符串,请使用分号来分隔模式 (例如,""*.TXT;*.DOC;*.BAK")。模式字符串可以是有效的文件名字符,星号 (*) 通配符字符的组合。模式字符串中,则不要包含空格。

系统不会更改过滤器的顺序。它在 lpstrFilter 中指定的顺序文件类型组合框中显示它们。

如果 lpstrFilter 为 NULL,对话框中不显示任何筛选器。
比如:"所有文件\0*.*\0C/C++ Flie\0*.cpp;*.c;*.h\0\0"
nFilterIndex:在文件类型控件中当前选定的筛选器的索引。由 lpstrFilter 指向的缓冲区包含对定义的筛选器的字符串。字符串的第一双有索引值为 1,第二个配对 2,等等。
lpstrFile:用来初始化文件名称的文件名称的编辑控件。如果初始化是不必要的话,此缓冲区的第一个字符必须为 NULL。
当 GetOpenFileName 或 GetSaveFileName 函数成功返回时,该缓冲区包含驱动器符、 路径、 文件名称和所选文件的扩展名。

如果设置了 OFN_ALLOWMULTISELECT 标志,用户选择多个文件,在缓冲区中包含当前目录依次选定文件的文件名。对于资源管理器样式对话框,目录和文件的名称字符串是 NULL 分隔,用额外的空字符后最后一个文件的名称。旧样式对话框,以空格分隔的字符串,函数使用短文件名的文件名称用空格。您可以使用目录中函数长、 短文件名之间进行转换。如果用户选择只有一个文件,lpstrFile 字符串没有之间的路径和文件名称的分隔符。
nMaxFile:以字符数计算,lpstrFile 所指向的缓冲区的大小。缓冲区必须足够大以存储的路径和文件名称字符串或字符串,包括终止 NULL 字符。缓冲区应至少 256 个字符长。
lpstrInitialDir:初始目录。留空由系统选择,但选择的初始目录的算法在不同系统上各不相同
lpstrTitle:要放在对话框的标题栏中的字符串。如果此成员为 NULL,则系统使用默认标题 。
Flags:一组位标志,这个成员可以是下列标志的组合。
OFN_FILEMUSTEXIST:用户可以在文件名称输入字段中键入唯一的现有文件的名称。如果指定了此标志,用户输入一个无效的名称的对话框过程在消息框中显示一个警告。如果指定了此标志,则是还会使用 OFN_PATHMUSTEXIST 标志。在打开对话框中,可以使用此标志。它不能用另存为对话框。

OFN_PATHMUSTEXIST:用户可以键入只有有效的路径和文件名。如果使用此标志,并且用户在文件名称输入字段中键入无效的路径和文件名,对话框函数在消息框中显示一个警告。

OFN_HIDEREADONLY:隐藏“以只读打开”复选框。
OFN_NODEREFERENCELINKS:指示对话框返回选定快捷方式的路径和文件名称 (.LNK) 文件。如果不指定此值,则对话框返回快捷方式引用的文件的路径和文件名称。
OFN_NONETWORKBUTTON:隐藏和禁用网络按钮。

OFN_OVERWRITEPROMPT:另存为对话框:如果所选的文件已经存在。用户必须确认是否要覆盖该文件。
lpstrDefExt:默认扩展名。GetOpenFileName和GetSaveFileName将追加到文件名称的此扩展,如果用户不能键入扩展名。此字符串可以为任意长度,但只有前三个字符追加。该字符串不应包含句点(.)。如果此成员为NULL,并且用户没有键入扩展名,没有扩展名追加。
FlagsEx

OFN_EX_NOPLACESBAR:如果设置了此标志,是不会显示位置栏。如果未设置此标志,资源管理器样式对话框包括一个栏包含用于常用的文件夹,如收藏夹和桌面图标的地方。

2。保存文件对话框:
BOOL WINAPI GetSaveFileName(
_Inout_ LPOPENFILENAME lpofn
);


参数:一个指向OPENFILENAME结构的指针,其中包含用于初始化对话框的信息。GetSaveFileName返回时,此结构包含有关用户的文件选择的信息。(见上面)
返回值:如果用户指定的文件名,并单击确定按钮,返回值不为零。指向的 OPENFILENAME 结构的 lpstrFile 成员在缓冲区中包含完整的路径和文件名称。如果用户取消或关闭打开对话框或发生错误,则返回值为零。

3。浏览选择文件夹:SHGetSpecialFolderLocation和SHGetPathFromIDList
PIDLIST_ABSOLUTE SHBrowseForFolder(
_In_ LPBROWSEINFO lpbi
);


lpbi:指向包含用来显示对话框中的信息的BROWSEINFO结构的指针。

返回值:返回指定的命名空间的根与所选的文件夹位置的PIDL。如果用户在对话框中选择取消按钮,返回值为NULL。

BROWSEINFO 结构:

typedef struct _browseinfo {
HWND              hwndOwner;
PCIDLIST_ABSOLUTE pidlRoot;
LPTSTR            pszDisplayName;
LPCTSTR           lpszTitle;
UINT              ulFlags;
BFFCALLBACK       lpfn;
LPARAM            lParam;
int               iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;


hwndOwner:拥有者窗口句柄

pidlRoot:置NULL

pszDisplayName:接收文件夹路径的缓冲区指针

lpszTitle:对话框标题

ulFlags:为对话框中指定选项的标志

BIF_RETURNONLYFSDIRS:只返回文件系统目录。如果用户选择的文件夹不是文件系统的一部分,确定按钮显示为灰色。

BIF_DONTGOBELOWDOMAIN:不包括域级别下的网络文件夹对话框的树视图控件中。

BIF_EDITBOX:允许用户键入项目名称的浏览对话框中包含一个编辑控制。

BIF_VALIDATE:如果用户在编辑框中键入了无效的名称,浏览对话框中调用应用程序的BrowseCallbackProc与BFFM_VALIDATEFAILED消息。如果未指定 BIF_EDITBOX,则忽略此标志。

BIF_NEWDIALOGSTYLE:使用新的用户界面。将此标志设置为用户提供一个更大的对话框,可以调整大小。对话框中有几个新功能,包括: 在

对话框、 重新排序、 快捷菜单、 新文件夹、 删除和其他快捷菜单命令内的拖放功能。

BIF_USENEWUI:使用新的用户界面,包括编辑框。此标志是相当于 BIF_EDITBOX |BIF_NEWDIALOGSTYLE。

BIF_UAHINT:与 BIF_NEWDIALOGSTYLE 相结合,将用法提示添加到对话框中,在编辑框位置。BIF_EDITBOX 将覆盖此标志。

BIF_NONEWFOLDERBUTTON:在浏览对话框中不包括新文件夹按钮。

BIF_NOTRANSLATETARGETS:当选定的项是一条快捷方式时,返回快捷方式本身,而不是其目标。

BIF_BROWSEFORCOMPUTER:只有返回计算机。如果用户选择计算机之外的任何内容,OK 按钮显示为灰色。

BIF_BROWSEINCLUDEFILES:浏览对话框中显示的文件以及文件夹。

完整源码:

#include "stdafx.h"
#include<windows.h>
//打开保存文件对话框
#include<Commdlg.h>

//选择文件夹对话框
#include<Shlobj.h>
#pragma comment(lib,"Shell32.lib")

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR    lpCmdLine,
_In_ int       nCmdShow)
{
loop:
OPENFILENAME ofn = { 0 };
TCHAR strFilename[MAX_PATH] = { 0 };//用于接收文件名
ofn.lStructSize = sizeof(OPENFILENAME);//结构体大小
ofn.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄
ofn.lpstrFilter = TEXT("所有文件\0*.*\0C/C++ Flie\0*.cpp;*.c;*.h\0\0");//设置过滤
ofn.nFilterIndex = 1;//过滤器索引
ofn.lpstrFile = strFilename;//接收返回的文件名,注意第一个字符需要为NULL
ofn.nMaxFile = sizeof(strFilename);//缓冲区长度
ofn.lpstrInitialDir = NULL;//初始目录为默认
ofn.lpstrTitle = TEXT("请选择一个文件");//使用系统默认标题留空即可
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;//文件、目录必须存在,隐藏只读选项
if (GetOpenFileName(&ofn))
{
MessageBox(NULL, strFilename, TEXT("选择的文件"), 0);
}
else{
MessageBox(NULL, TEXT("请选择一个文件"), NULL, MB_ICONERROR);
goto loop;
}

ofn.Flags =  OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;//目录必须存在,覆盖文件前发出警告
ofn.lpstrTitle = TEXT("保存到");//使用系统默认标题留空即可
ofn.lpstrDefExt = TEXT("cpp");//默认追加的扩展名
if (GetSaveFileName(&ofn))
{
MessageBox(NULL, strFilename, TEXT("保存到"), 0);
}
else{
MessageBox(NULL, TEXT("请输入一个文件名"), NULL, MB_ICONERROR);
}

TCHAR szBuffer[MAX_PATH] = { 0 };
BROWSEINFO bi = { 0 };
bi.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄
bi.pszDisplayName = szBuffer;//接收文件夹的缓冲区
bi.lpszTitle = TEXT("选择一个文件夹");//标题
bi.ulFlags = BIF_NEWDIALOGSTYLE;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (SHGetPathFromIDList(idl, szBuffer)){
MessageBox(NULL, szBuffer, TEXT("你选择的文件夹"), 0);
}
else{
MessageBox(NULL, TEXT("请选择一个文件夹"), NULL, MB_ICONERROR);
}

return 0;
}

效果图:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: