首页
归档
友情链接
关于
Search
1
在wsl2中安装archlinux
80 阅读
2
nvim番外之将配置的插件管理器更新为lazy
58 阅读
3
2018总结与2019规划
54 阅读
4
PDF标准详解(五)——图形状态
33 阅读
5
为 MariaDB 配置远程访问权限
30 阅读
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
登录
Search
标签搜索
c++
c
学习笔记
windows
文本操作术
编辑器
NeoVim
Vim
win32
VimScript
emacs
Java
linux
文本编辑器
elisp
反汇编
OLEDB
数据库编程
数据结构
内核编程
Masimaro
累计撰写
309
篇文章
累计收到
27
条评论
首页
栏目
心灵鸡汤
软件与环境配置
博客搭建
从0开始配置vim
Vim 从嫌弃到依赖
archlinux
Emacs
MySQL
Git与Github
AndroidStudio
cmake
读书笔记
菜谱
编程
PDF 标准
从0自制解释器
qt
C/C++语言
Windows 编程
Python
Java
算法与数据结构
PE结构
页面
归档
友情链接
关于
搜索到
1
篇与
的结果
2015-12-22
windows API实现用户选择文件路径的对话框
在编写应用程序时,有时需要用户选择某个文件,以供应用程序使用,比如在某些管理程序中需要打开某一个进程,这个时候需要弹出一个对话框来将文件路径以树形图的形式表示出来,以图形化的方式供用户选择文件路径,而不是需要用户自己输入文件路径。在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 = {0}; TCHAR szBuf[4096] = {0}; BROWSEINFO bi = {0}; bi.hwndOwner = NULL; bi.iImage = 0; 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 0; }
2015年12月22日
9 阅读
0 评论
0 点赞