C++ 打开选择文件夹对话框选择目录的操作

下面是详细的攻略:

目录选择框的使用方法

C++ 通过调用 Windows API 流程来打开选择文件夹对话框,选择和获取用户选择的目录信息。具体步骤如下:

  1. 通过 CoInitialize 函数来初始化 COM 库。
  2. 调用 Windows API 函数 CoCreateInstance 获取 IFileOpenDialog 的 Interface 指针,同时设置打开对话框的 Options 和 Title 等属性。
  3. 调用 IFileOpenDialogSetFileTypeIndex 函数和 SetFileTypes 函数,设置选择对话框的文件类型和默认选项。
  4. 调用 IFileOpenDialogShow 函数来显示选择对话框,并根据用户的选择进行相应的操作。
  5. 调用 IFileOpenDialogGetResult 函数获取用户选择的目录信息,并进行相应的操作。

下面分别对上述步骤进行详细说明。

步骤一:初始化 COM 库

在使用选择对话框前,我们需要先调用 CoInitialize 函数来初始化 COM 库。COM(组件对象模型)是一组微软的标准技术,用于支持不同的应用程序和代码库之间的通信,因此在使用和调用 Windows API 函数时,需要先进行 COM 库的初始化,调用方式如下:

CoInitialize(NULL);

步骤二:获取 IFileOpenDialog 接口指针并设置属性

获取 IFileOpenDialog 接口指针时,我们需要通过 CoCreateInstance 函数调用 Windows API 来获取,同时设置打开对话框的 Options 和 Title 等属性。代码如下:

// 创建 IFileOpenDialog 接口指针
IFileOpenDialog *pFileOpen;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileOpen));
if (SUCCEEDED(hr))
{
    // 设置打开对话框的 Options 和 Title 等属性
    DWORD dwOptions;
    hr = pFileOpen->GetOptions(&dwOptions);
    if (SUCCEEDED(hr))
    {
        hr = pFileOpen->SetOptions(dwOptions | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM);
    }
    if (SUCCEEDED(hr))
    {
        hr = pFileOpen->SetTitle(L"Select a folder");
    }
}

其中,FOS_PICKFOLDERS 表示打开时只显示文件夹,而 FOS_FORCEFILESYSTEM 表示只选择文件系统中的文件夹,这两个属性可以限制用户只能选择文件夹。而打开对话框的 Title 属性则设置为 "Select a folder"。

步骤三:设置文件类型和默认选项

设置选择对话框的文件类型和默认选项可以通过调用 IFileOpenDialogSetFileTypeIndex 函数和 SetFileTypes 函数来实现。其中,SetFileTypeIndex 函数可以设置对话框显示的文件类型,而 SetFileTypes 函数则可以设置文件类型筛选列表。代码示例如下:

// 设置默认选项
if (SUCCEEDED(hr))
{
    hr = pFileOpen->SetFileTypeIndex(0);
}
// 设置文件类型筛选列表
if (SUCCEEDED(hr))
{
    COMDLG_FILTERSPEC filter;
    filter.pszName = L"All Files";
    filter.pszSpec = L"*.*";
    hr = pFileOpen->SetFileTypes(1, &filter);
}

步骤四:显示选择对话框

调用 IFileOpenDialogShow 函数来显示选择对话框,并根据用户的选择进行相应的操作。代码如下:

// 显示选择对话框
if (SUCCEEDED(hr))
{
    hr = pFileOpen->Show(NULL);
}
// 根据用户的选择进行相应的操作
if (SUCCEEDED(hr))
{
    IShellItem *pItem;
    hr = pFileOpen->GetResult(&pItem);
    if (SUCCEEDED(hr))
    {
        PWSTR pszFilePath;
        hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
        if (SUCCEEDED(hr))
        {
            // 在此处处理选择的目录信息
            CoTaskMemFree(pszFilePath); // 释放内存
        }
        pItem->Release();
    }
}

其中,Show 函数的第一个参数可以传入父窗口的句柄,这里我们传入 NULL 表示没有父窗口。而 GetResult 函数则用来获取用户选择的目录信息。最后,我们可以通过 GetDisplayName 函数获取用户选择的文件夹的路径,进行相应处理。

步骤五:释放资源

最后,我们需要释放资源,调用 CoUninitialize 函数来释放 COM 库,代码如下:

CoUninitialize();

示例代码

关于目录选择框的更多使用可以参考 官方文档

下面是一个简单的示例代码,用来选择文件夹并打印出选择的目录信息:

#include <Windows.h>
#include <ShObjIdl.h>
#include <iostream>

#pragma comment(lib, "Comctl32.lib")
#pragma comment(lib, "Ole32.lib")

int main()
{
    HRESULT hr = CoInitialize(NULL);

    // 创建 IFileOpenDialog 接口指针
    IFileOpenDialog *pFileOpen;
    hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFileOpen));
    if (SUCCEEDED(hr))
    {
        // 设置打开对话框的 Options 和 Title 等属性
        DWORD dwOptions;
        hr = pFileOpen->GetOptions(&dwOptions);
        if (SUCCEEDED(hr))
        {
            hr = pFileOpen->SetOptions(dwOptions | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM);
        }
        if (SUCCEEDED(hr))
        {
            hr = pFileOpen->SetTitle(L"Select a folder");
        }
        // 设置默认选项
        if (SUCCEEDED(hr))
        {
            hr = pFileOpen->SetFileTypeIndex(0);
        }
        // 设置文件类型筛选列表
        if (SUCCEEDED(hr))
        {
            COMDLG_FILTERSPEC filter;
            filter.pszName = L"All Files";
            filter.pszSpec = L"*.*";
            hr = pFileOpen->SetFileTypes(1, &filter);
        }
        // 显示选择对话框
        if (SUCCEEDED(hr))
        {
            hr = pFileOpen->Show(NULL);
        }
        // 获取选择的目录信息
        if (SUCCEEDED(hr))
        {
            IShellItem *pItem;
            hr = pFileOpen->GetResult(&pItem);
            if (SUCCEEDED(hr))
            {
                PWSTR pszFilePath;
                hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath);
                if (SUCCEEDED(hr))
                {
                    // 在此处处理选择的目录信息
                    std::wcout << "Selected directory: " << pszFilePath << std::endl;
                    CoTaskMemFree(pszFilePath);
                }
                pItem->Release();
            }
        }

        pFileOpen->Release();
    }

    CoUninitialize();

    return 0;
}

运行示例代码后,会弹出一个文件夹选择对话框,选择文件夹后会输出所选择的目录信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 打开选择文件夹对话框选择目录的操作 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++教程之array数组使用示例详解

    C++教程之array数组使用示例详解 本篇文章主要介绍C++中数组的使用方法,包括声明、初始化、遍历、使用等详细攻略。 数组的声明和初始化 定义数组时需要指定数组类型、数组名称和数组长度。C++中数组的长度必须是一个常量表达式。 // 定义一个长度为5的int类型数组 int array1[5]; // 定义一个长度为4的double类型数组,并初始化 d…

    other 2023年6月25日
    00
  • 剑指Offer之Java算法习题精讲二叉树专题篇上

    剑指Offer之Java算法习题精讲二叉树专题篇上 一、前言 二叉树是算法中非常重要的数据结构,也是面试时常被考察的知识点。在这篇文章中,我们会详细讲解剑指Offer中关于二叉树的Java算法习题精讲,帮助读者更好地掌握二叉树的相关知识。 二、题目汇总 下面是本篇文章中涉及的二叉树习题题目汇总: 题目编号 题目名称 题目描述 4 重构二叉树 输入前序遍历和中…

    other 2023年6月27日
    00
  • Ant Design of Vue的树形控件Tree的使用及说明

    Ant Design 是一款优秀的 React UI 库,它的 Vue 版本 Ant Design of Vue 同样也是备受欢迎的UI框架之一。Ant Design of Vue中提供了一种常用的可展开、可收起的树形控件 Tree,下面我来详细介绍如何使用及说明。 安装 可以通过 npm 或 yarn 安装 Ant Design of Vue。 使用 np…

    other 2023年6月27日
    00
  • win10系统桌面右键没反应桌面图标也不显示的两种解决方法图文教程

    下面我将详细讲解“win10系统桌面右键没反应桌面图标也不显示的两种解决方法图文教程”。 问题描述 在使用Win10系统时,有时会遇到桌面右键没反应,桌面图标也不显示的情况,导致无法正常使用。此时需要进行相应的解决。 解决方法 方法1:修复桌面图标 步骤1: 按下Win+X,选择“命令提示符(管理员)”并运行。 步骤2: 在命令提示符中输入以下命令并按回车键…

    other 2023年6月27日
    00
  • python 名称空间与作用域详情

    Python 名称空间与作用域详情 在Python中,名称空间(Namespace)是一个用于存储和访问变量名称的容器,而作用域(Scope)是指在程序中访问这些名称的可见性和生命周期。理解名称空间和作用域的概念对于编写可维护和可扩展的Python代码非常重要。 名称空间(Namespace) 名称空间是一个存储变量名称和对应对象的映射关系的容器。Pytho…

    other 2023年8月8日
    00
  • Spring注解驱动之BeanPostProcessor后置处理器讲解

    Spring注解驱动之BeanPostProcessor后置处理器讲解 简介 在 Spring 容器中,BeanPostProcessor 是 Bean 工厂级别的拦截器接口。当一个 Bean 对象在容器实例化、配置和其他初始化工作完成后,以及它依赖的其他 Bean 对象都已经完全初始化后,Spring 容器允许 BeanPostProcessor 对象对该…

    other 2023年6月27日
    00
  • 详解Java中的封装、继承、多态

    我来详细讲解一下Java中的封装、继承和多态。 封装 封装是一种面向对象编程的概念,它在Java中的实现是使用类和访问控制修饰符来保护数据和行为的访问权限。封装可以让设计者隐藏类的实现细节,将类的接口与实现分离,提高代码的复用性和安全性。 在Java中,我们可以使用public、private、protected和default修饰符来控制访问权限。其中,p…

    other 2023年6月25日
    00
  • qbittorrent搜索插件合集

    qbittorrent搜索插件合集 qbittorrent是一个免费的、跨平台的BitTorrent客户端,它被广泛用于在PC上下载种子文件。它的最大特点是轻量级,支持种子文件的管理、下载、上传等功能,而且还有非常友好的用户界面。尽管qbittorrent自带一些搜索插件,但是这些插件并不一定涵盖所有的种子资源,所以需要第三方提供的插件。在这篇文章中,我们将…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部