C语言用SHBrowseForFolder弹出选择文件夹的对话框

2024-01-30 13:12

本文主要是介绍C语言用SHBrowseForFolder弹出选择文件夹的对话框,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【程序运行效果】

【程序代码】

main.c:

#define COBJMACROS
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <windowsx.h>
#include <CommCtrl.h>
#include <ShlObj.h>
#include "resource.h"#pragma comment(lib, "comctl32.lib")
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' language='*' publicKeyToken='6595b64144ccf1df'\"")int CALLBACK bff_callback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{if (uMsg == BFFM_INITIALIZED && lpData != 0) // 当对话框刚初始化成功时SendMessage(hwnd, BFFM_SETSELECTIONA, TRUE, lpData); // 选择指定的默认文件夹return 0;
}// 浏览文件夹
void bff(HWND parent_dialog)
{char name[MAX_PATH]; // MAX_PATH专门表示路径的最大长度char path[MAX_PATH];char text[MAX_PATH + 100];BROWSEINFOA info = {0};HRESULT hr;HWND textbox;IMalloc *shell_malloc;LPITEMIDLIST item_list;// 获取文本框输入的文件夹路径textbox = GetDlgItem(parent_dialog, IDC_EDIT1);GetWindowTextA(textbox, path, MAX_PATH);info.hwndOwner = parent_dialog; // 指定父窗口info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; // 禁止选择像"回收站"这种非正常文件夹(此选项在XP系统下无效); 使用新式对话框info.pszDisplayName = name; // 用于接收选择的文件夹名称的变量info.lpszTitle = "请选择一个文件夹:"; // 提示文字info.lpfn = bff_callback; // 设置回调函数info.lParam = (LPARAM)path; // 设置默认选择的文件夹为文本框输入的文件夹item_list = SHBrowseForFolderA(&info);if (item_list != NULL){// 将选择的文件夹路径显示到文本框中SHGetPathFromIDListA(item_list, path);if (path[0] == '\0' && name[0] != '\0')strcpy_s(path, MAX_PATH, name);SetWindowTextA(textbox, path);// 全选SetFocus(textbox);Edit_SetSel(textbox, 0, -1);// 将选择的文件夹名称显示到文本框下方_snprintf_s(text, sizeof(text), sizeof(text) - 1, "您选择的文件夹的名称是: %s", name);SetDlgItemTextA(parent_dialog, IDC_STATIC2, text);// 释放item_list占用的内存hr = SHGetMalloc(&shell_malloc);if (SUCCEEDED(hr)){IMalloc_Free(shell_malloc, item_list);IMalloc_Release(shell_malloc);}}
}// 显示窗口图标
void init_icons(HWND dlg)
{HICON icon;HMODULE instance;instance = GetModuleHandle(NULL);icon = LoadImage(instance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);SendMessage(dlg, WM_SETICON, ICON_BIG, (LPARAM)icon);icon = LoadImage(instance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);SendMessage(dlg, WM_SETICON, ICON_SMALL, (LPARAM)icon);
}// 获取并显示当前exe文件所在的文件夹
void init_default_path(HWND dlg)
{char path[MAX_PATH];char *p;GetModuleFileNameA(NULL, path, MAX_PATH);p = strrchr(path, '\\');if (p != NULL)*p = '\0';SetDlgItemTextA(dlg, IDC_EDIT1, path);SetDlgItemTextA(dlg, IDC_STATIC2, "");
}INT_PTR CALLBACK dlg_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{int id;switch (uMsg){case WM_COMMAND:id = LOWORD(wParam);switch (id){case IDOK:case IDCANCEL:EndDialog(hDlg, 0);break;case IDC_BUTTON1:bff(hDlg);break;}break;case WM_INITDIALOG:init_icons(hDlg);init_default_path(hDlg);break;}return 0;
}int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{int ret;InitCommonControls();ret = (int)DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, dlg_proc);return ret;
}

【开发环境截图】

【C++语言写法】
(1)源文件扩展名由c改为cpp。
(2)去除顶部的#define COBJMACROS。
(3)bff函数中:
IMalloc_Free(shell_malloc, item_list)改成shell_malloc->Free(item_list)。
IMalloc_Release(shell_malloc)改成shell_malloc->Release()。
(4)init_icons函数中:LoadImage前加上(HICON)强制转换。

这篇关于C语言用SHBrowseForFolder弹出选择文件夹的对话框的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660348

相关文章

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字