浅析C++中的打开文件、保存文件(OPENFILENAME)

本文介绍了C++中使用OPENFILENAME结构体进行文件打开和保存的详细过程,包括结构体各参数的意义和使用注意事项。重点强调了如何初始化对话框以及GetOpenFileName和GetSaveFileName函数的使用。同时提到了ZeroMemory函数的作用,用于0初始化内存块。
摘要由CSDN通过智能技术生成

首先看看msdn上如何描述的:

Contains information that the GetOpenFileName and GetSaveFileName functions use to initialize an Open or Save As dialog box. After the user closes the dialog box, the system returns information about the user’s selection in this structure.

OPENFILENAME是一个结构体,我们看看这个结构体如何定义的:

typedef struct tagOFN {
  DWORD lStructSize;//指定这个结构的大小,以字节为单位。
  HWND  hwndOwner;//指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框没有所有者它可以为NULL。
  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;

结构体中每个参数的意义。
hInstance
如果在Flags成员中设置了OFN_ENABLETEMPLATEHANDLE标记,hInstance成员指向包含一个对话框模板的内存对象。如果OFN_ENABLETEMPLATE标记被设置,hInstance是一个指向通过lpTemplateName成员命名的对话框模板的模块。如果两者都没有被设置,这个成员被忽略。
如果OFN_EXPLORER标记被设置,系统使用Explorer风格的默认对话框的子窗口作为指定模板来建立一个对话框。如果OFN_EXPLORER标记没有被设置,系统使用模板建立一个旧风格的对话框。

lpstrFilter
指向一对以空字符结束的过滤字符串的一个缓冲。缓冲中的最后一个字符串必须以两个NULL字符结束。
第一个字符串是过滤器描述的显示字符串(例如,“文本文件”),第二个字符指定过滤样式(例如,“.TXT”)。要为一个显示字符串指定多个过滤样式,使用分号(“;”)分隔样式(例如,“.TXT;.DOC;.BAK”)。一个样式字符串中可以包含有效的文件名字字符及星号(*)通配符。不能在样式字符串中包含空格。
系统不能改变过滤器的次序。它按lpstrFilter指定的次序显示在文件类型组合框中。
如果lpstrFilter是NULL,对话框不能显示任何过滤器。

lpstrCustomFilter
指向一个静态缓冲,它包含了一对以空字符结束的过滤器字符串,这个字符串是为了保留用户选择的过滤样式。第一个字符串是描述定制过滤器的显示字符串,第二个字符串是被用户选择的过滤器样式。第一次你的应用程序建立对话框,你指定的第一个字符串可以是任何非空的字符串。当用户选择了一个文件时,对话框复制当前过滤样式到第二个字符串。保留过滤样式可以是在lpstr

在Windows下,你可以使用Common Dialog库来实现通过对话框打开文件并批量选择文件。以下是一个示例代码: ```cpp #include <windows.h> #include <commdlg.h> int main() { // 初始化OPENFILENAME结构体 OPENFILENAME ofn; char szFile[260] = { 0 }; ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFile = szFile; ofn.nMaxFile = sizeof(szFile); ofn.lpstrFilter = "All Files (*.*)\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; // 显示打开文件对话框 if (GetOpenFileName(&ofn) == TRUE) { // 处理选择的文件路径 char* p = szFile; while (*p) p += strlen(p) + 1; // 定位到路径末尾 // 如果只选择了一个文件,p指向文件名 if (*(p + 1) == '\0') { printf("选择的文件路径:%s\n", szFile); } else { // 否则,p指向第一个文件名,后续是其他文件名 printf("选择的文件夹路径:%s\n", szFile); p++; while (*p) { printf("文件名:%s\n", p); p += strlen(p) + 1; } } } else { // 用户取消了选择 printf("取消选择文件\n"); } return 0; } ``` 这段代码会打开一个文件对话框,用户可以选择一个或多个文件。选择的文件路径会被打印出来。如果用户取消了选择,则会打印"取消选择文件"。 请注意,这段代码是基于Windows API编写的,因此在其他平台上可能无法编译运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值