C++ 打开文件夹对话框-OPENFILENAME

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

效果图:

 实现方式

#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</

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值