在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而不是需要用户自己输入文件路径。

  在MFC中能够弹出对话框供用户选择文件路径的类是CFileDialog,但是这个类的主要问题是当用户选择文件路径后,会打开相关的文件,与我们的要求不符,在Windows平台下有两个函数SHBrowseForFolder、SHGetPathFromIDList。这两个函数的说明如下:

LPITEMIDLIST WINAPI SHBrowseForFolder(
LPBROWSEINFO lpbi
);

该函数的主要作用是弹出一个对话框,便于用户选择文件的路径,传递的参数是一个LPBROWSEINFO的结构体,这个结构体的原型如下:

typedef struct _browseinfo {
HWND hwndOwner;//该对话框的属主窗口句柄
LPCITEMIDLIST pidlRoot;//对话框中显示的最上层目录
LPTSTR pszDisplayName;//指向一个缓冲区,用于返回用户选择的文件名
LPCTSTR lpszTitle;//文件对话框的标题
UINT ulFlags;//文件对话框相关标志
BFFCALLBACK lpfn;//文件对话框对应的回调函数的地址
LPARAM lParam;//附加参数
int iImage;//返回用户选中的图片的索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

其中最主要的参数是pszDisplayName,这个参数指向一个缓冲区,用于存储用户选择的文件名(只是文件名不包括具体的路径);lpszTitle这个参数表示的是对话框的具体名称,这两个参数有一个没有给则会造成程序的错误,主要是对话框不能出来。另外的是标志的变量,一般使用的是BIF_BROWSEINCLUDEFILES(允许用户选择文件)、BIF_RETURNONLYFSDIRS(只能选择目录,不能选择文件)

在用户选择了相关的文件并点击对话框中的确定时,会返回一个LPITEMIDLIST的指针,这个结构表示的是文件系统的相关信息,接下来就是利用函数SHGetPathFromIDList来真正获取用户选择的文件路径,该函数的原型如下:

WINSHELLAPI BOOL WINAPI SHGetPathFromIDList(
LPCITEMIDLIST pidl,
LPSTR pszPath
);

该函数主要利用pidl对应的文件系统的相关信息,通过第二个参数返回文件的路径,下面是具体的例子:

#include <windows.h>
#include <Shlobj.h>
#include <tchar.h>
#include <Commctrl.h> #pragma comment(lib, "comctl32.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
LPITEMIDLIST pil = NULL;
INITCOMMONCONTROLSEX InitCtrls = {};
TCHAR szBuf[] = {};
BROWSEINFO bi = {};
bi.hwndOwner = NULL;
bi.iImage = ;
bi.lParam = NULL;
bi.lpfn = NULL;
bi.lpszTitle = _T("请选择文件路径");
bi.pszDisplayName = szBuf;
bi.ulFlags = BIF_BROWSEINCLUDEFILES; InitCommonControlsEx(&InitCtrls);//在调用函数SHBrowseForFolder之前需要调用该函数初始化相关环境
pil = SHBrowseForFolder(&bi);
if (NULL != pil)//若函数执行成功,并且用户选择问件路径并点击确定
{
SHGetPathFromIDList(pil, szBuf);//获取用户选择的文件路径
wprintf_s(_T("%s"), szBuf);
} return ;
}

windows API实现用户选择文件路径的对话框的更多相关文章

  1. 2019-9-2-win10-uwp-保存用户选择文件夹

    title author date CreateTime categories win10 uwp 保存用户选择文件夹 lindexi 2019-09-02 12:57:38 +0800 2018-2 ...

  2. Qt选择文件路径

    QString file_path = QFileDialog::getExistingDirectory(this, "请选择文件路径...", "./"); ...

  3. 010——C#选择文件路径

    (一)具体教程查看:011——C#创建ECXEL文件(附教程) (二)代码:foldPath 就是获取到的文件路径 private void button1_Click(object sender, ...

  4. win10 uwp 保存用户选择文件夹

    如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...

  5. C# 选择文件路径,选择文件

    // 选择文件: private string SelectPath() { string path = string.Empty; var openFileDialog = new Microsof ...

  6. Winform选择目录路径与选择文件路径

    https://blog.csdn.net/zaocha321/article/details/52528279 using System.Collections.Generic; using Sys ...

  7. Windows Store App 用户库文件夹操作

    上面介绍了与用户库文件有关的操作,包括创建.读写等,下面将介绍与用户库文件夹相关的操作. 与文件操作一样,想要对用户库文件夹进行操作,需要首先获取用户库的相应位置,获取的方法上面已经介绍过了,这里不再 ...

  8. Windows Store App 用户库文件分组

    在Windows应用商店应用程序中浏览用户库中的文件时,可以将文件或者文件夹分组显示,以便于进行分类浏览,这类似于音乐库中的文件可以按照艺术家名称.创建日期或者评级等多种方式进行分类.本节内容将会介绍 ...

  9. Windows Store App 用户库文件操作

    (1)获取用户库位置 如果想要通过应用程序在用户库中创建文件,首先需要获得用户库中指定的位置,例如图片库.文档库等.这里值得注意的是,在获取用户库的位置之前,必须在Windows应用商店项目的清单文件 ...

随机推荐

  1. openstack中的floating ip与阿里云的公网ip

    项目组因业务需求使用openstack搭建了一个私有云,本想在vm上搭建一个ftp.源是vsftpd.所有配置都完成了,在远程登录的时候却出现了 这个问题. 初一看以为是文件夹权限的问题,可上上下下全 ...

  2. OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记

    说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...

  3. ASP.NET Zero--3.菜单配置

    配置一个如上图所示的菜单   1.打开文件MpaNavigationProvider.cs [..\MyCompanyName.AbpZeroTemplate.Web\Areas\Mpa\Startu ...

  4. ACM博弈问题小试

    题目: 取石子(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作 ...

  5. 三分钟跑起jsblocks

      1下载代码 git clone https://github.com/astoilkov/jsblocks-seed.git 2安装依赖 Peng@PENG-PC /F/home/qianduan ...

  6. CentOS7安装和配置Nginx(https)

    安装Nginx下载安装包# wget http://nginx.org/download/nginx-1.11.7.tar.gz# tar -zxvf nginx-1.11.7.tar.gz# cd ...

  7. 今天学习的裸板驱动之存储控制器心得(初始化SDRAM)

    CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1 ...

  8. AndroidAsyncHttp 临时修复 JsonHttpResponseHandler 避免死循环

    由于 AndroidAsyncHttp 1.4.4 的 JsonHttpResponseHandler  存在死循环的 BUG,1.4.5 版本发布不知道要何时,所以只能临时替换该类来修复这个错误. ...

  9. jQuery Validate【强大的表单验证】

    一.引入菜鸟教程提供的 1.14.0 版本下载地址:http://static.runoob.com/download/jquery-validation-1.14.0.zip <script ...

  10. 用CKEDITOR 做自助上传的解决方案2

    1,在plugins下新建文件夹 multiimg 2,创建文件plugin.js (function() { CKEDITOR.plugins.add("multiimg", { ...