效果图:

实现方式
#include<iostream>
#include<cstring>
#include<string>
#include<string.h>
#include <shlobj.h>
#define STRICT_TYPED_ITEMIDS
using namespace std;
int main()
{
OPENFILENAME ofn; // common dialog box structure
LPWSTR szFile =NULL; // buffer for file name
HWND hwnd =NULL; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter =TEXT("All\0*.*\0Text\0*.TXT\0") ;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
//ofn.lpstrInitialDir = NULL;
ofn.lpstrInitialDir = TEXT("D:\\");//默认的文件路径
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn) == TRUE)
hf = CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
return 0;
}
问题
GetOpenFileName(&ofn) 未定义
需要添加以下配置

OPENFILENAME
包含 GetOpenFileName 和 GetSaveFileName 函数用于初始化 打开 或 另存为 对话框的信息。 用户关闭对话框后,系统会返回有关此结构中用户选择的信息。
语法
typedef struct tagOFNA {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCSTR lpstrFilter;
LPSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPSTR lpstrFile;
DWORD nMaxFile;
LPSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCSTR lpstrInitialDir;
LPCSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCSTR lpTemplateName;
LPEDITMENU lpEditInfo;
LPCSTR lpstrPrompt;
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
} OPENFILENAMEA, *LPOPENFILENAMEA;
成员
lStructSize
类型:DWORD
结构的长度(以字节为单位)。 用于 sizeof (OPENFILENAME) 此参数。
hwndOwner
类型:HWND
拥有对话框的窗口的句柄。 此成员可以是任何有效的窗口句柄,如果对话框没有所有者,则该成员可以为 NULL 。
hInstance
类型: HINSTANCE
如果在 Flags 成员中设置了OFN_ENABLETEMPLATEHANDLE标志,则 hInstance 是包含对话框模板的内存对象的句柄。 如果设置了 OFN_ENABLETEMPLATE 标志, 则 hInstance 是包含 由 lpTemplateName 成员命名的对话框模板的模块的句柄。 如果未设置两个标志,则忽略此成员。 如果设置了 OFN_EXPLORER 标志,系统会使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子级。 如果未设置 OFN_EXPLORER 标志,系统会使用模板创建替换默认对话框的旧样式对话框。
lpstrFilter
类型: LPCTSTR
包含以 null 结尾的筛选器字符串对的缓冲区。 缓冲区中的最后一个字符串必须以两个 NULL 字符终止。
每对中的第一个字符串是一个显示字符串,描述筛选器 (,例如“文本文件”) ,第二个字符串指定筛选器模式 (例如 ".TXT") 。 若要为单个显示字符串指定多个筛选器模式,请使用分号分隔模式 (例如 “.TXT;.DOC;”。BAK“) 。 模式字符串可以是有效文件名字符和星号 (*) 通配符的组合。 不要在模式字符串中包含空格。
系统不会更改筛选器的顺序。 它按 lpstrFilter 中指定的顺序在文件类型组合框中显示它们。
如果 lpstrFilter 为 NULL,则对话框不显示任何筛选器。
对于快捷方式,如果未设置筛选器, 则 GetOpenFileName 和 GetSaveFileName 将检索 .lnk 文件的名称,而不是其目标。 此行为与在 Flags 成员中设置OFN_NODEREFERENCELINKS标志相同。 若要在不筛选的情况下检索快捷方式的目标,请使用字符串 "All Files\0*.*\0\0"。
lpstrCustomFilter
类型: LPTSTR</

本文展示了如何在C++中使用WindowsAPI的GetOpenFileName函数来创建一个文件选择对话框,允许用户从指定的初始目录中选择一个文件。代码示例初始化了OPENFILENAME结构,并指定了文件过滤器,对话框的默认路径和其它相关设置。
最低0.47元/天 解锁文章
330

被折叠的 条评论
为什么被折叠?



