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

  在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. ajax实现分页

    使用ajax分页原理:第一步:做一个表格 第二步:封装两个方法.第三步:新建个负责显示页面.第四步:做一个纯PHP处理页面处理要显示页的所有数据 首先使用一张数据比较多的数据库中的表格: 首页面加载后 ...

  2. Libevent核心原理

    Libevent 是一个事件驱动框架, 不能仅说他是一个网络库. notejs就是采用与libevent类似的libev来做核心驱动的.   Libevent支持三种事件:io事件.信号事件.时间事件 ...

  3. 五、RDD持久化

    Spark最重要的一个功能是它可以通过各种操作(operations)持久化(或者缓存)一个集合到内存中.当你持久化一个RDD的时候,每一个节点都将参与计算的所有分区数据存储到内存中,并且这些数据可以 ...

  4. Sipdroid实现SIP(六): SIP中的请求超时和重传

    目录 一. Sipdroid的请求超时和重传 二. SIP中超时和重传的定义 三. RFC中超时和重传的定义 一. Sipdroid的请求超时和重传 Sipdroid实现SIP协议栈系列, 之前的文章 ...

  5. js分页模板

    /** *参数说明: *currentPage:当前页数 *countPage:总页数 *changeMethod:执行java后台代码的js函数,即是改变分页数据的js函数 */ function  ...

  6. 鼠标形状css样式

    鼠标形状css样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. CodeForces 707D Persistent Bookcase

    $dfs$,优化. $return$操作说明该操作完成之后的状态和经过操作$k$之后的状态是一样的.因此我们可以建树,然后从根节点开始$dfs$一次(回溯的时候复原一下状态)就可以算出所有状态的答案. ...

  8. MFC多线程各种线程用法 .

    http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleTh ...

  9. 3.struts2访问Servlet API,并和mybaits实现全套增删改查

    1.创建数据库脚本userinfo.sql prompt PL/SQL Developer import file prompt Created on 2016年5月19日 by pc set fee ...

  10. 7.MyBatis延时加载

    1.创建javaWeb项目MyBatis_Lazy并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17.jar my ...