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

yizhihongxing

下面是详细的攻略:

目录选择框的使用方法

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日

相关文章

  • 编写自己的 GitHub Action,体验自动化部署

    编写自己的 GitHub Action,体验自动化部署的完整攻略 GitHub Action是GitHub提供的一种自动化工具,可以帮助用户自动化执行各种任务,例如构建、测试、部署等。本文将为您提供如何编写自己的GitHub Action,体验自动化部署的完整攻略,包括创建Action、编写Action代码、测试Action等内容。 创建Action 以下是…

    other 2023年5月6日
    00
  • thinkphp多层MVC用法分析

    ThinkPHP多层MVC用法分析 什么是多层MVC架构 多层MVC架构是指在基本的MVC(Model-View-Controller)架构基础上,增加了service层或者business层,旨在实现业务逻辑与表现逻辑的分离,并且增加了复杂业务逻辑的封装与重用。相较于传统的二层架构,多层MVC架构可以更好的优化系统架构,增强系统的可读性、可扩展性和可维护性…

    other 2023年6月27日
    00
  • Win11右键反应慢怎么解决?Win11右键菜单打开慢的解决办法

    下面是详细讲解关于“Win11右键反应慢怎么解决?Win11右键菜单打开慢的解决办法”的完整攻略。 问题分析 首先,面对Win11右键反应慢的问题,我们需要对问题进行一个初步分析。大多数情况下,Win11右键菜单打开慢的原因是由于系统负荷过大,或者是由于系统出现了类似于病毒或者是恶意软件等问题导致的。基于这个问题分析,我们可以采取以下解决方案。 解决方案 设…

    other 2023年6月27日
    00
  • WPS 插件和鼠标右键的精妙配合

    标题:WPS插件和鼠标右键的精妙配合攻略 正文: WPS插件可以极大地提高我们的工作效率,而鼠标右键也是我们经常使用的快捷键之一。在WPS中,将插件与鼠标右键配合起来,可以使我们的日常工作更加高效便捷。 一、安装WPS插件 要实现WPS插件的右键菜单功能,首先需要安装对应的插件。我们以WPS文字为例,步骤如下: 打开WPS文字软件,点击“插件”菜单下的“插件…

    other 2023年6月27日
    00
  • 安卓5.1官网下载地址 android5.1系统刷机包下载

    安卓5.1官网下载地址 安卓5.1是一款较旧的安卓操作系统版本,但仍然有一些用户希望使用它。在本攻略中,我将为您提供安卓5.1系统的官方下载地址以及刷机包的下载方法。 1. 官网下载地址 您可以从以下官方网站下载安卓5.1系统: 安卓官方网站:官方网站通常提供最新的安卓系统版本,但您可能需要在网站上进行一些导航才能找到旧版本的下载链接。 2. 刷机包下载 一…

    other 2023年8月4日
    00
  • 浅谈css的栅格布局

    浅谈 CSS 的栅格布局 随着移动设备的普及,响应式设计已经成为了重要的网页设计原则之一。而 CSS 的栅格布局也是实现响应式设计的常用方法之一。本文将简要介绍 CSS 的栅格布局,以及如何使用常见的栅格布局框架。 栅格布局的原理 栅格布局指的是将一个页面分成若干等宽的列,放置网页组件。当页面缩小或放大时,列的宽度也会相应地缩小或放大。这样,页面布局会随着设…

    其他 2023年3月28日
    00
  • Android 侧滑按钮的实现代码

    当实现Android侧滑按钮时,可以使用以下步骤: 创建布局文件:首先,创建一个包含侧滑按钮的布局文件。可以使用RelativeLayout或ConstraintLayout作为根布局,并在其中添加一个按钮。例如,以下是一个简单的布局文件示例: <RelativeLayout xmlns:android=\"http://schemas.an…

    other 2023年9月6日
    00
  • monkey基本命令及脚本编写

    以下是“monkey基本命令及脚本编写”的完整攻略: monkey基本命令及脚本编写 Monkey是一款Android平台上的压力测试工具,可以拟用户在设备上执行各种操作,以测试应用程序的稳定性和性能。本攻略中,我们将重点介绍Monkey本命令及脚本编写。 基本命令 1. 运行Monkey 要运行Monkey,请命令行中输入以下命令: adb shell m…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部