最近更新于 2025-08-14 12:21
前言
这个示例是演示 AutoCAD 的文件导航对话框使用,参考了 ObjectARX samples 中 FielNav。
下面是用到的对象:
- CNavDataArray:保存文件导航对话框中选中的文件项
- CNavFilterArray:保存文件导航对话框可用的过滤器列表
- CNavFilter:表示一个文件过滤器
- CAcUiNavDialog:AutoCAD 风格的“文件导航对话框”类
测试环境
- Windows 11 24H2
- Visual Studio 2022(ISO C++14)
- AutoCAD Mechanical 2025
- 环境配置:https://blog.iyatt.com/?p=21187
基本示例
新建 ARX 项目
项目名 FileNav
勾选 MFC
创建 CAcUiNavDialog 的子类
在项目名称上右键添加新建项
左边选 ObjectARX,再选里面的 ArxWizMFCSupport,点击添加
子类命名为 FileNavDlg,基类选 CAcUiNavDialog
实现通过命令打开文件导航对话框
在项目名称上右键添加类
类名:FileNavDlgCmd
在 FileNavDlgCmd 头文件下添加两个全局变量
private:
// 存储用户选择的文件信息
static CNavDataArray gDataArray;
// 存储不同类型文件的过滤条件
static CNavFilterArray gFilterArray;
在 FileNavDlgCmd 源文件下添加它们的定义
CNavDataArray FileNavDlgCmd::gDataArray;
CNavFilterArray FileNavDlgCmd::gFilterArray;
在 FileNavDlgCmd 源文件下引用自定义的文件导航对话框
#include "FileNavDlg.hpp"
在类视图下,FileNavDlgCmd 类上右键添加函数
添加代码
// 定义文件类型过滤规则
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 初始化函数
添加代码
// 注册命令 IYATTyxFileNav,所属组 IYATTyxFileNavGroup
acedRegCmds->addCommand(L"IYATTyxFileNavGroup", L"IYATTyxFileNav", L"IYATTyxFileNav", ACRX_CMD_MODAL, FileNavDlgCmd::fileNavCmd);
为 FileNavDlgCmd 添加 unload 卸载函数
添加代码
// 卸载组 IYATTyxFileNavGroup
acedRegCmds->removeGroup(L"IYATTyxFileNavGroup");
添加调用
类视图下,双击 CFileNavApp 类,在源文件引用 FileNavDlgCmd.hpp
在 On_kInitAppMsg 方法中调用初始化
在 On_kUnloadAppMsg 中调用卸载
运行测试,使用 IYATTyxFileNav 命令可以打开自定义的文件导航对话框
支持文件多选
点打开后,在命令行显示选中的文件
ObjectARX 2026(MFC):文件导航对话框