MFC选择目录

下面的代码封装了MFC选择目录的函数,适用于高低版本的Windows系统和高低版本的Visual Studio.

少啰嗦,先看东西。

XP系统或低版本VS编译出来的结果:

XP以上的系统并且高版本VS编译出来的结果:

同时支持一次选择多个文件夹。代码的使用也超简单,调用一个函数即可。

Talk is cheap. Show me the code.

//SelectPathDlg.h
#pragma once
#include <vector>

/*
* hwndOwner: 父窗口句柄,multSel: 是否运行选择多个目录
* 使用很简单:
* std::vector<CString> dirs = select_path_dlg(GetSafeHwnd(), false);
*/
std::vector<CString> select_path_dlg(HWND hwndOwner = NULL, bool multSel = false);
bool os_higher_than_xp();
CString select_path_dlg_xp(HWND hwndOwner);
//SelectPathDlg.cpp
#include "stdafx.h"
#include "SelectPathDlg.h"
#if defined(_MSC_VER) && _MSC_VER >= 1400 // VC++ 8.0
// Disable warning about strdup being deprecated.
#pragma warning(disable : 4996)
#endif

bool os_higher_than_xp()
{
    bool ans = false;
    OSVERSIONINFO osInfo;
    osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&osInfo);
    if (osInfo.dwPlatformId == 2) {
        if (osInfo.dwMajorVersion >= 6)
            ans = true;
    }
    return ans;
}

CString select_path_dlg_xp(HWND hwndOwner)
{
    CString ans;
    BROWSEINFO bi = { 0 };
    memset(&bi, 0, sizeof(bi));
    bi.hwndOwner = hwndOwner;
    bi.lpszTitle = _T("选择一个文件夹");
    bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;
    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
    if (!pidl) {
        return ans;
    }
    TCHAR path[MAX_PATH];
    SHGetPathFromIDList(pidl, path);
    ans = path;

    IMalloc * imalloc = 0;
    if (SUCCEEDED(SHGetMalloc(&imalloc))) {
        imalloc->Free(pidl);
        imalloc->Release();
    }
    return ans;
}

std::vector<CString> select_path_dlg(HWND hwndOwner /*= NULL*/, bool multSel /*= false*/)
{
    std::vector<CString> ans;
    if (os_higher_than_xp()) {
#if _MSC_VER >= 1600
        CWnd * pWnd = hwndOwner != NULL ? CWnd::FromHandle(hwndOwner) : NULL;
        if (multSel) {
            CFolderPickerDialog dlg(NULL, OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_ENABLESIZING, pWnd);
            if (dlg.DoModal() == IDOK) {
                POSITION pos = dlg.GetStartPosition();
                while (pos) {
                    ans.push_back(dlg.GetNextPathName(pos));
                }
            }
        } else {
            CFolderPickerDialog dlg(NULL, OFN_FILEMUSTEXIST | OFN_ENABLESIZING, pWnd);
            if (dlg.DoModal() == IDOK) {
                ans.push_back(dlg.GetPathName());
            }
        }
#else
        ans.push_back(select_path_dlg_xp(hwndOwner));
#endif
    } else {
        ans.push_back(select_path_dlg_xp(hwndOwner));
    }
    return ans;
}

欢迎拍砖。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 MFC 中链接 ObjectARX,可以按照以下步骤进行操作: 1. 创建 MFC 应用程序:首先,在 Visual Studio 中创建一个新的 MFC 应用程序项目。选择“创建新项目”,然后选择MFC 应用程序”。 2. 配置项目属性:在项目属性对话框中,选择“配置属性” > “常规”。在“字符集”选项中,选择“使用多字节字符集”。 3. 添加 ObjectARX 头文件和库文件路径:在项目属性对话框中,选择“配置属性” > “VC++ 目录”,然后在“包含目录”和“库目录”中添加 ObjectARX 的头文件和库文件的路径。 4. 添加 ObjectARX 的附加依赖项:在项目属性对话框中,选择“配置属性” > “链接器” > “输入”。在“附加依赖项”中添加 ObjectARX 的库文件(例如,arx.lib)。 5. 编写使用 ObjectARX 的代码:在 MFC 应用程序的源文件中,包含 ObjectARX 的头文件,并使用 ObjectARX 的 API 进行开发。您可以创建 ObjectARX 的对象、调用函数以及处理 AutoCAD 的图形数据等。 6. 构建和运行应用程序:编译和构建 MFC 应用程序,然后运行它。确保 ObjectARX 的库文件正确链接,并且应用程序能够正常调用和使用 ObjectARX 的功能。 请注意,上述步骤是一般的指导,具体的实现步骤可能会因您的环境和需求而有所不同。确保您已正确安装和配置 ObjectARX,并参考 ObjectARX 和 MFC 的文档以获取更详细的信息和示例代码。 希望这些信息对您有所帮助!如果您有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值