ObjectARX 2026(MFC):文件导航对话框

最近更新于 2025-08-14 12:21

前言

这个示例是演示 AutoCAD 的文件导航对话框使用,参考了 ObjectARX samples 中 FielNav。

下面是用到的对象:

file

  • CNavDataArray:保存文件导航对话框中选中的文件项
  • CNavFilterArray:保存文件导航对话框可用的过滤器列表

file

  • CNavFilter:表示一个文件过滤器

file

  • CAcUiNavDialog:AutoCAD 风格的“文件导航对话框”类

测试环境

基本示例

新建 ARX 项目

file

项目名 FileNav
file

勾选 MFC
file

创建 CAcUiNavDialog 的子类

在项目名称上右键添加新建项
file

左边选 ObjectARX,再选里面的 ArxWizMFCSupport,点击添加
file

子类命名为 FileNavDlg,基类选 CAcUiNavDialog
file

实现通过命令打开文件导航对话框

在项目名称上右键添加类
file

类名:FileNavDlgCmd
file

在 FileNavDlgCmd 头文件下添加两个全局变量

private:
    // 存储用户选择的文件信息
    static CNavDataArray gDataArray;
    // 存储不同类型文件的过滤条件
    static CNavFilterArray gFilterArray;

file

在 FileNavDlgCmd 源文件下添加它们的定义

CNavDataArray FileNavDlgCmd::gDataArray;
CNavFilterArray FileNavDlgCmd::gFilterArray;

file

在 FileNavDlgCmd 源文件下引用自定义的文件导航对话框

#include "FileNavDlg.hpp"

file

在类视图下,FileNavDlgCmd 类上右键添加函数
file
file

添加代码

    // 定义文件类型过滤规则
    const ACHAR* filterAll[] = { L"*.*", nullptr };
    const ACHAR* filterCpp[] = { L"*.cpp", L"*.hpp", nullptr };
    const ACHAR* filterDo[] = { L"*.docx", L"*.txt", nullptr };
    const ACHAR* filterDwg[] = { L"*.dwg", L"*.dxf", nullptr };
    const ACHAR* filterImg[] = { L"*.jpg", L"*.png", L"*.bmp", nullptr };

    // 将过滤规则组合成数组
    const ACHAR** filterSpec[] = { filterAll, filterCpp, filterDo, filterDwg, filterImg, nullptr };

    // 对应过滤器的描述
    const ACHAR* filterDescription[] = {
        L"所有文件",
        L"C++ 文件",
        L"文档文件",
        L"AutoCAD 文件",
        L"图像文件",
    };

    // 初始化
    gFilterArray.RemoveAllData();

    // 创建文件过滤器
    for (int i = 0; filterSpec[i] != nullptr; ++i)
    {
        // 添加一个新的过滤器对象,并得到它的指针
        CNavFilter* filter = gFilterArray.AddData();

        if (filter != nullptr)
        {
            // 设置过滤器的描述文字
            filter->SetDescription(filterDescription[i]);

            // 添加对应的文件扩展名规则
            for (int j = 0; filterSpec[i][j] != nullptr; ++j)
            {
                filter->Add(filterSpec[i][j]);
            }
        }
    }

    // 显示文件导航对话框
    {
        // 获取 AutoCAD 主窗口句柄
        HWND acadHandle = adsw_acadDocWnd();

        // 确保 AutoCAD 主窗口已启用且获得焦点
        ::EnableWindow(acadHandle, true);
        ::SetFocus(acadHandle);

        // 将 Windows API 窗口对象转为 MFC 窗口对象
        CWnd* pWnd = CWnd::FromHandle(acadHandle);

        // 创建自定义文件导航对话框对象
        FileNavDlg dlg(gDataArray, gFilterArray, 0U, pWnd);
        // 允许多选文件
        dlg.SetMultiSelectAllowed(true);
        // 设置对话框标题
        dlg.SetDialogCaption(L"自定义文件导航对话框");
        // 显示模态对话框
        if (dlg.DoModal() == IDOK)
        {
            // 用户点击确定后的处理
            for (int i = 0; i < gDataArray.GetCount(); ++i)
            {
                // 获取文件的 shell ID
                LPITEMIDLIST id = gDataArray[i]->GetID();

                // 获取用户在文件名输入框选中的文本
                CString text = gDataArray[i]->GetText();

                // 输出到 AutoCAD 命令行
                if (text.GetLength() != 0)
                {
                    acutPrintf(L"\n文件名:%s", text.GetString());
                }
            }
        }
    }

为 FileNavDlgCmd 添加 init 初始化函数
file

添加代码

    // 注册命令 IYATTyxFileNav,所属组 IYATTyxFileNavGroup
    acedRegCmds->addCommand(L"IYATTyxFileNavGroup", L"IYATTyxFileNav", L"IYATTyxFileNav", ACRX_CMD_MODAL, FileNavDlgCmd::fileNavCmd);

file

为 FileNavDlgCmd 添加 unload 卸载函数
file

添加代码

    // 卸载组 IYATTyxFileNavGroup
    acedRegCmds->removeGroup(L"IYATTyxFileNavGroup");

file

添加调用

类视图下,双击 CFileNavApp 类,在源文件引用 FileNavDlgCmd.hpp
file

在 On_kInitAppMsg 方法中调用初始化
file

在 On_kUnloadAppMsg 中调用卸载
file

运行测试,使用 IYATTyxFileNav 命令可以打开自定义的文件导航对话框
file

file

支持文件多选
file

点打开后,在命令行显示选中的文件
file

ObjectARX 2026(MFC):文件导航对话框
Scroll to top
打开目录