每幅截图保留原始 PNG 字节和像素尺寸,不添加序号、箭头或定位框,不重采样、不使用有损压缩。点击图片可切换“适合窗口 / 原始像素”。
根据页签、按钮名称和界面位置阅读图下说明;操作先后顺序以正文步骤为准。
网页指南于 2026 年 9 月 27 日补充部署、结果复核与故障定位;以下旧日期和旧版本号用于识别既有截图及案例取证,不作为当前下载版本。软件请按官网下载中心列出的完整程序包及版本说明使用。
本手册帮助开发者和集成人员使用 CADViewX x86 ActiveX/OCX,完成控件注册、开发授权、VB6 与 Excel/VBA 宿主集成、图纸查看、图层管理、坐标换算和位图输出。2026 年 9 月 13 日修订内容对应官网 OCX 开发包 2026.09.11.114833。每一章都说明操作入口、执行步骤、成功现象和失败后怎样处理。本版 VB6 与 Excel/VBA 截图使用项目 案例\CADViewX 中的指定宿主、控件图和测试图纸,便于将实际按钮与相应接口对应起来;授权截图仍使用不可激活的隔离演示状态。
官网 ZIP 中控件文件名为 CadViewX.ocx,其公开类型库、控件类和示例代码仍按包内兼容身份使用;不要根据 ZIP 名称自行改 ProgID、CLSID 或事件声明。CADViewX 网页预览使用独立产品入口,查看方式见第十章。
1. 开始前准备正确的控件包
CADViewXJL 面向 Windows 上的 32 位宿主,配套独立 x64 解析器。典型集成场景为 VB6 窗体、32 位支持 ActiveX 的桌面程序。64 位宿主不能直接加载这个 x86 OCX;配套 x64 解析器也不会把 OCX 自动变成 64 位控件。
完整保留以下文件,不要只复制 OCX:
| 文件 | 作用 |
|---|---|
| CadViewX.ocx | 官网包中的 32 位控件及内嵌类型库 |
| CADViewXJLParser.exe | 大图或受内存条件限制时使用的独立解析器 |
| register-user.cmd / unregister-user.cmd | 当前用户注册及注销 |
| register-machine-admin.cmd / unregister-machine-admin.cmd | 管理员执行的全机器注册及注销 |
| VB6App.exe.manifest.template | 终端免注册 COM 清单模板 |
| README.txt、验证结果与第三方声明 | 分发说明及对应构建证据 |
本版默认 AlwaysUseParserProcess=True:无论宿主是独立 EXE、Excel、Word、PowerPoint 或其他 32 位容器,DWG、DXF 和支持的图片都交给同目录的 64 位 CADViewXJLParser.exe 解析,再把经过边界检查的只读二维快照交给 OCX。只有在已验证的受控场景中显式设为 False,才先尝试 32 位进程内解析。OCX 与解析器协议不一致时,LastLoadError 会提示版本不一致;必须从同一个 ZIP 同时替换两者,不能只更新 OCX。
加载进度默认在任务持续 5 秒后显示。宿主可设置 ProgressDelaySeconds 为 0–3600;设为 0 会立即显示运行中进度,较大的值只改变提示出现时间,不改变加载本身。AlwaysUseParserProcess 与 ProgressDelaySeconds 都是控件实例属性,应在实际工作表、UserForm 或窗体中保存、关闭、重新打开后再核对持久化结果。
升级前必须先关闭 Excel、Word、PowerPoint、Access、Visio 和 VB6,再运行新目录中的注册脚本。脚本会检查这些宿主是否仍在占用控件,并只清理本控件位于 Excel、VBE 和 Microsoft Forms 目录中的旧 EXD 类型库缓存。若工作表已能看到新属性而 VBA UserForm 仍看不到,先关闭全部 Office/VB6,重新运行正确范围的注册脚本,再重新打开工作簿;不要手工删除无关控件的缓存,也不要关闭 Office 安全策略作为解决办法。
控件实现了 Office 持久化所需的安全初始化声明,为受支持的工作表与 UserForm 容器创建和还原控件提供兼容声明;是否允许加载仍受 Office 版本与企业安全策略控制。这个声明不是“允许任意脚本安全执行”的通行证,也不替代企业 Defender、ASR、AppLocker 或 WDAC 策略。最终仍应分别在目标电脑的 32 位 Excel 工作表和 VBA UserForm 中做一次可见验收:插入控件、保存、关闭、重开、加载一份脱敏图纸、退出;本机的类型库与自动化测试不能代替客户设备上的这一轮检查。
本轮目标为 Windows 10/11 x64,具体最低版本与实测范围见兼容性报告。不能从当前主机通过推断 Win7/8.1、所有 VB6 工程或所有打印机已兼容。
1.1 解压、版本与解析器的逐项核对
先把官网下载的 ZIP 保存到一个新的版本目录,核对文件名中的版本与当前下载页及同批校验回执一致;若交付页同时提供 SHA-256,应在完整下载后计算并比对。不要直接从压缩包预览或注册控件,也不要覆盖仍在使用的旧目录。完整解压后,先确认 CadViewX.ocx 与 CADViewXJLParser.exe 同时存在,再查看 README、注册脚本和第三方声明。Windows 若显示来自网络的安全提示,应由企业管理员按本单位策略处理,不能通过关闭 Defender、禁用宏保护或把整块磁盘加入排除项来省略检查。
把新旧两个版本分别放在明确命名的目录中,例如“已验证版”和“待验收版”。注册前记录当前 OCX 的绝对路径和文件版本;注册后再读取实际生效路径,避免脚本提示成功但宿主仍加载旧文件。若多个 Windows 账户共用电脑,当前用户注册和全机器注册应选定一种范围,并由管理员记录,不能在不知道原状态时交替运行两套脚本。回退时先关闭所有宿主,注销待验收版,再恢复原目录和原注册范围;不要只把新文件改成旧文件名。
加载图纸时,OCX 先建立一次请求,再由同目录解析器处理文件。AlwaysUseParserProcess=True 下,任务管理器中短暂出现解析器进程属于预期;加载完成或失败后,该次进程应退出。超过 ProgressDelaySeconds 才出现进度窗,不等于在此之前没有工作。若解析器被安全软件阻止、协议版本不一致、文件不存在或输出校验失败,应读取 LastLoadError,清空与本次结果不符的文件名和统计,再允许用户重新选择;不能继续展示上一张图并仅在状态栏写“失败”。
正式验收至少准备三类脱敏样本:一张小型 DXF 用于快速功能回归,一张包含中文、旋转文字、不同线型和多个图层的代表图,一张接近日常最大规模的大图用于独立解析和内存检查。每张图都记录打开时间、Active、FileName、文字或图层统计、全图结果以及关闭后的进程状态。大图只打开成功还不够,还要放大到局部查看细线和小字,再平移到其他区域确认画面能继续更新。
Office 需要拆成两条路线。工作表路线在 32 位 Excel 中插入控件,设置两个新属性,保存工作簿、退出 Excel、重新打开并加载脱敏图;UserForm 路线在 VBA 设计器中放置控件,核对属性窗格和事件列表,保存、退出、重开后再运行窗体。两条路线均应使用默认安全设置,不通过“信任对 VBA 工程对象模型的访问”或关闭受保护视图来绕过问题。若只有一条路线成功,应按失败路线记录,不可概括为“Excel 已兼容”。
2. 开发机注册与两种授权办理方式
使用公司局域网授权:先由企业管理员安装并激活服务端,再使用配套企业客户端连接管理员提供的内网 IP 和端口。员工无需逐台扫码购买。请按员工连接步骤操作;安装、席位、续费与升级见局域网授权服务端部署手册。下载入口在下载中心 · 局域网授权工具。
2.1 注册控件
1.将 ZIP 完整解压到长期使用的独立目录,关闭正在使用旧控件的宿主和设计器。
2.普通开发机优先双击 register-user.cmd,注册到当前用户范围。
3.确实需要所有用户使用时,以管理员身份运行 register-machine-admin.cmd。不要两个范围反复交叉注册来尝试“修好”错误。
4.脚本调用 Windows 的 32 位注册程序 %SystemRoot%\SysWOW64\regsvr32.exe;应使用包内脚本,而不是误用 64 位注册程序。
5.在 VB6 的“部件”中选择 CADViewXJL Control,放置到窗体,检查尺寸和窗口能正常显示。
注册成功表示 COM 注册信息建立,不等于软件授权完成,也不等于已完成真实 VB6 集成验收。
2.2 联网电脑扫码办理开发授权
在设计器中插入控件后,未取得有效开发授权时会显示注册窗口。先确认窗口中的产品为 CadViewX,并核对机器信息属于当前开发机。下面的流程用于电脑本身可以联网的情况。

原始高清 PNG:936 × 848 像素;无后加序号、箭头或定位框,未重采样、未使用有损压缩。原始 PNG
- 先核对当前控件授权状态
- 用手机扫描开发机当前窗口中的二维码
- 在手机页面核对产品与机器后办理试用或购买
936 × 848 原始 PNG。这里是隔离演示窗口,二维码不能用于真实激活;
图中使用合成设备信息,窗口标题注明“演示资料(不联网)”。请扫描自己电脑软件窗口中的二维码,手册中的图仅用于找到操作位置。
1.保持开发机的注册窗口打开,用手机微信扫描窗口中的二维码。不要扫描手册截图中的演示二维码。
2.在手机页面核对产品和机器信息,再按页面完成相应的授权申请。授权期限与费用以办理页面显示的实际内容为准。
3.办理完成后回到电脑,等待注册窗口重新检查状态。只有电脑显示授权已生效,才继续在设计器中使用控件。
4.如果手机页面已完成而电脑仍未变化,先检查开发机是否可以访问授权服务,再查看产品是否选对。不要反复购买同一份授权来尝试刷新。
5.关闭注册窗口后,重新查看控件是否正常显示。保存自己的工程,再关闭并重新打开设计器,确认状态可以延续。
手机扫码成功与开发机取得有效配置是两个检查点。仅看到手机页面完成,不应替代电脑端的生效检查。电脑无法联网时,改按下一节办理和复制离线配置。
2.3 离线开发机使用配置文件

原始高清 PNG:936 × 848 像素;无后加序号、箭头或定位框,未重采样、未使用有损压缩。原始 PNG
- 联网开发机等待软件自动取得有效授权
- 离线开发机按离线授权流程办理
- 下载配置后复制到实际加载的控件同目录
- 需要核对设备时复制当前机器码
936 × 848 原始 PNG。联网与离线办理共用同一窗口;
这幅图与上一幅来自同一个真实注册窗口,正文分别说明扫码和离线操作入口。两种方式共用这个窗口,无须寻找另一个离线注册页面。
1.在离线开发机上打开注册窗口,保留当前产品和机器信息。使用手机或另一台联网电脑办理这台开发机的授权,不要误办成联网电脑自己的机器。
2.完成办理后下载对应的签名配置文件 config.ini。确认产品是 CadViewX,并确认该文件针对需要使用控件的开发机。
3.将文件复制到实际加载的 CadViewX.ocx 同一目录。如果电脑上有多个旧控件目录,应先确认设计器当前注册和加载的是哪一份。
4.让注册窗口重新检查配置;必要时关闭正在使用控件的设计器,再重新打开工程。不要在仍占用旧控件的进程里反复替换不同文件。
5.核对授权状态和有效期,再做一次插入控件、打开练习图纸和退出设计器的检查。文件已经复制但没有生效时,优先检查目录、产品、机器和期限。
保留办理得到的原文件,不手工修改其中的有效期或签名字段。另一台机器、OCR 或 DGS 的配置不能直接用于本控件。离线续期时应替换为针对同一开发机重新签发的有效文件;配置有误或已过期时,联系管理员核对授权记录。
2.4 开发授权与终端运行的区别
这是设计时开发授权。编译后宿主通过标准 UserMode=True 表明运行态时,不要求每位终端用户再次购买开发授权;不要将开发机授权 INI 随客户程序分发。
它没有自动实现按终端机器销售的商业流程。需要按终端计费、按项目计费或增加宿主账户权限时,应在宿主产品中单独实现。不能把开发授权解释为每个最终用户都要重新扫码,也不能把它当成独立终端授权防绕过系统。
3. 在宿主中打开第一张图纸

原始高清 PNG:2300 × 1050 像素;无后加序号、箭头或定位框,未重采样、未使用有损压缩。原始 PNG
- 点击宿主提供的打开文件按钮
- 等待真实加载完成,并记录本次耗时状态
- 核对彩色图纸条带已经显示,而不是只看函数没有报错
2300 × 1050 原始像素裁切。画面由真实 `工程new.exe` 加载用户指定 `案例/CADViewX/测试用例.dwg` 后截取;19.463 秒只是本机这一次显示值,不作为通用性能承诺。
本版图中不是合成界面,也不是旧版三联拼图:实际启动用户指定的 案例\CADViewX\VB6案例\工程new.exe,点击“打开文件”,选择 案例\CADViewX\测试用例.dwg,等待窗口显示 用时:19.463s 后再截取无压缩 PNG。该 DWG 为 33,024,134 字节;图中用时只记录本机这一次打开结果,不承诺其他电脑或其他图纸具有同样速度。公开网页只发布截图,不上传指定 DWG、VB6 工程或可执行文件。
读者自行练习时仍可使用本书配套的“演示线束工位.dxf”,不要将它与上述截图取证用 DWG 混为同一文件。如果你是开发者,先按前两章完成环境准备与开发授权;如果你在使用已集成的正式宿主,请使用该宿主实际提供的打开和查看按钮。
3.1 先明确这个窗口由谁提供
图中的“打开文件”和“用时”由这个真实 VB6 示例宿主提供;两条图纸显示区域属于嵌入控件。宿主按钮在被点击时调用控件接口,把加载过程和结果变成看得见的操作。将控件放到自己的窗体后,开发者仍需自己安排按钮、状态栏、文件对话框和异常提示;控件不会自动替宿主生成这些界面。
第一次接入可以只做三个按钮:打开、全图、关闭。不要同时加入账户、数据库和批量导出,以免失败时不知道是哪一部分出错。这个最小查看器通过后,再加入图层、坐标和位图功能。
3.2 在设计器中安排空间
窗体上方留一行命令区,中间让控件占据主要空间,下方留状态提示。控件宽高不能为零,否则即使加载成功也没有可检查的画面。窗口改变尺寸后,宿主应将控件调整到剩余客户区,避免右侧或底部被覆盖。刚完成布局时,先拉大、缩小宿主,检查图纸区域与按钮是否始终分开。
如果使用 VB6,窗体和控件的位置尺寸可能采用 Twips,鼠标换算接口使用像素。不要为了得到屏幕位置,把控件的 Left、Top 直接加到鼠标事件 X、Y 上。先确认各变量所属坐标系,只有需要转换为桌面位置的宿主弹窗才再增加父窗口偏移。

原始高清 PNG:1720 × 800 像素;无后加序号、箭头或定位框,未重采样、未使用有损压缩。原始 PNG
- 点击工作表上的直接嵌入按钮
- 核对控件内上方白色图纸区域已经加载
- 继续核对下方彩色线束对象没有缺失
1720 × 800 原始像素裁切,来自用户指定 `Excel控件.xlsm` 的实际运行画面。
上图是指定 Excel控件.xlsm 中“直接嵌入”运行后的真实工作表,不再把工作表、UserForm 和代码编辑器压缩到一张拼图里。“直接嵌入”是宿主按钮;白色图纸区域和彩色线束区域是控件中实际显示的内容。

原始高清 PNG:1210 × 750 像素;无后加序号、箭头或定位框,未重采样、未使用有损压缩。原始 PNG
- 在 UserForm 中点击打开图纸
- 读取并记录本次加载耗时
- 核对 UserForm 控件中的图纸主体与表格区域
1210 × 750 原始像素裁切,来自同一 `Excel控件.xlsm` 的实际 UserForm 画面。工作表嵌入和 UserForm 是两个宿主场景,必须分别保存、关闭并重新打开验证。
这张图单独保留同一工作簿的 UserForm 运行画面。工作表控件和 UserForm 控件的创建、保存与重新加载路径不同,因此必须分开验收,不能用其中一张成功截图代替另一种宿主场景。
3.3 第一次成功的判断顺序
第一次接入可先用说明书演示 DXF 走通流程,再用项目实际需要的代表性 DWG 回归。点击打开、等待函数返回,然后依次检查 Active、FileName、TextCount 和画面。Active 是判断当前是否存在已加载文档的重要依据;FileName 用于确认本次文件;文字数量用于辅助排查,不是完整性的唯一证明。对于本版指定测试 DWG,还要像真实 VB6 和 Excel 截图那样分别核对上方白色对象、下方彩色线束以及大范围表格/连接关系是否可见。
一个实际可用的宿主应让用户看见这四种状态:尚未打开、正在加载、加载成功、加载失败。不要把无异常统一写成“成功”,也不要加载失败后继续显示上一个文件的名称和统计。成功提示应在取得当前结果后更新,错误状态则清空与本次不符的业务信息。
3.4 给用户可执行的失败动作
用户选择不存在或损坏的图纸后,应能再次点击“打开”选择其他文件,而不需要退出整个宿主。示例中的“不存在文件”按钮专门演示这一状态:它调用一个不可能存在的练习路径,不改用户原图。控件中的错误文字和底部 Active=False 应一致。
程序若需要恢复之前的图纸,可以在宿主中保存“上一次成功路径”,提供“重新打开上一图”动作。不能只把旧文件名放回状态栏,因为控件内部旧文档已经可能被清理。重新打开也应完整走成功与失败判断。
3.5 VB6 打开按钮的完整示例
先在窗体放置名为 CADViewXJL1 的控件,使用已存在的小型 DXF:
Private Sub cmdOpen_Click()
On Error GoTo ComError
CADViewXJL1.LoadFile "D:\Drawing\sample.dxf"
If Not CADViewXJL1.Active Then
MsgBox "图纸没有加载成功,请检查控件错误画面和文件。"
Exit Sub
End If
CADViewXJL1.ZoomExtents
Debug.Print CADViewXJL1.FileName
Debug.Print CADViewXJL1.EntityCount
Debug.Print CADViewXJL1.TextCount
Exit Sub
ComError:
MsgBox "控件调用失败:" & Err.Description
End SubLoadFile 是无返回值方法。找不到文件或解析失败时,当前实现可能返回正常 COM 状态并在控件内显示错误,而不抛异常;因此 On Error 不能代替 Active 检查。当前加载会先清理旧图,失败后不保证原图仍保留。宿主若需要“打开失败恢复上一图”,应自行保留上一个路径并提供明确恢复动作。
成功时会发出 OnAfterLoad。需要显示属性或建立自己的列表,可在该事件或成功检查后读取。EntityCount 是当前渲染表示的线段、文字和填充数量之和,不保证等于源 CAD 数据库的顶层实体数量;用它评估解析规模时应避免把曲线离散后的段数当成原始对象数。
3.6 大图处理与关闭图纸
默认独立解析策略见 1.1;不要按文件大小推断直接解析。进度按 ProgressDelaySeconds 延后显示(默认 5 秒),不表示剩余时间。首次集成测试小 DXF、代表性 DWG、中文路径、大图及损坏文件;错误时记录大小、路径和完整错误,避免重入。CloseFile 关闭后检查 Active=False。
4. 鼠标操作与视图调整
4.1 从全图到局部检查
先执行全图显示,观察外框与主体是否完整;把鼠标移到需要检查的文字附近,滚轮逐级放大,再按住中键或左键小幅平移。检查完一处后回到全图,再寻找另一处。这样能把“对象不存在”和“对象在当前视野外”区分开。
局部放大时,线条更粗、文字出现或消失可能与绘制尺度相关。应以同一对象在多个倍率下的连续表现判断,不要仅截一张极小概览就断言文字丢失。较细的原图线在屏幕上仍受像素分辨率限制;当需要比较细节时,让控件窗口足够大。
4.2 旋转、适应窗口与重置
相对旋转保持当前缩放状态,长方形图纸转成竖向后可能暂时超出窗口。这时再执行全图,就会得到完整的竖向构图。完成方向检查后使用 ResetView 回到零度并适应全图,而不是继续重复点击旋转直到“看起来差不多”。
宿主中最好将“向左旋转”“向右旋转”和“恢复默认方向”分成清楚的动作。保存自己的视图状态时记录中心、比例和角度,而不是只记一个缩放数值。切换到另一张图后不要无条件套用旧中心,否则新图可能完全落在可视区域外。
4.3 平移参数的实际例子
调用 PanView 50, 0 表示向控件客户区右侧平移五十个像素;调用 PanView 0, -30 表示向上平移三十个像素。它不把图中某个连接器移动五十毫米。调用前后可以用一条固定基准线观察它相对窗口的位置,再用 CAD 坐标转换检查几何坐标未被编辑。
若宿主希望“以图纸单位移动视野”,应先根据当前比例和旋转把位移换成正确的显示偏移,或采用 SetView 设定目标中心。对于旋转视图,不能简单把一个毫米数字直接传给 PanView。将这两类操作在按钮名称上分清,用户就不容易误解为图元编辑。
4.4 鼠标操作速查
| 操作 | 结果 |
|---|---|
| 左键或中键按住拖动 | 平移视图 |
| 鼠标滚轮 | 在启用 MouseWheelZoom 时定点缩放 |
| 左键或中键双击 | 适应全图 |
| 右键 | 在 SelfPopupMenu=True 时打开内置预览菜单 |
这是预览控件,不提供与 DGS 相同的对象选择、夹点编辑或路径绘制。若宿主拦截鼠标事件、修改属性或自行显示菜单,实际体验也会受宿主控制。
4.5 控件内置右键菜单
本轮右键菜单使用下列英文名称,可按表理解;这些不是假设存在的顶部工具条按钮:
| 实际菜单名称 | 功能 |
|---|---|
| Zoom Extents | 适应全图 |
| Zoom In / Zoom Out | 放大 / 缩小 |
| Rotate Clockwise / Rotate Counterclockwise | 按当前菜单实现进行 90 度方向旋转 |
| Layers... | 打开带勾选状态的图层列表 |
| Copy Current View | 复制当前视图位图到剪贴板 |
Popup X, Y 可由宿主在指定控件客户区坐标显示该菜单。ShowLayersDialog 当前显示的是图层弹出列表,并非完整的 CAD 图层属性编辑对话框。图层列表最多呈现前 1000 项;更大列表可由宿主通过图层 API 自行建立界面。
ToolBarVisible、LayoutsBarVisible 等兼容属性存在,不代表当前实现已经绘制一套完整工具条、布局管理器或 3D 功能。DoToolButtonClick 的枚举包含历史名称,只有实际处理的动作才有功能;不能因看到 tbSave、tbOpen 或 tbOrbit3D 就向用户承诺对应按钮可用。
4.6 视图与显示接口速查
| 接口/属性 | 参数和当前语义 |
|---|---|
| ZoomExtents | 按当前图纸范围适应窗口 |
| PanView DeltaX, DeltaY | 控件客户区像素偏移,X 正值向右、Y 正值向下,不是 CAD 图纸单位 |
| RotateView Degrees | 相对当前角度旋转,单位度 |
| ViewRotation | 设置绝对旋转角度,单位度 |
| SetView CenterX, CenterY, Scale, Rotation | 中心使用 CAD 坐标;Scale 为相对于适应窗口比例的倍数;Rotation 为绝对角度 |
| ZoomWindow Left, Top, Right, Bottom | 用 CAD 坐标范围框选放大,返回 Boolean;零宽/高范围会失败 |
| HasPrevScale / PrevScale | 查询能否回到上一视图,再恢复;当前最多保留 32 份视图历史 |
| ResetView | 将旋转重置为零并适应全图 |
| ScaleFactor | 相对于适应窗口比例的缩放倍数,不是固定毫米比例 |
| ViewCenterX / ViewCenterY | 当前视图中心的 CAD 坐标 |
| Colored / DrawMode / ShowLineWeights | 彩色、绘制模式及线宽显示 |
| BackGroundColor / ForeColor | 背景与前景颜色 |
| ShowCrosshair / MouseWheelZoom | 十字光标与滚轮缩放开关 |
| PictureRepaint | 请求重绘 |
所有数值由宿主校验为有限值,比例用有效正数。不要将 mmWidth、mmHeight 的名义屏幕换算作为实体 1:1 工位校准依据;本控件没有 DGS 那套屏幕物理标定流程。
5. 按图层显示需要的内容
5.1 查找并隐藏一类辅助内容
示例图把外框、路径、文字、零件和尺寸放在不同图层。打开图层列表,先记住原来哪些项有勾选,再取消 PATH 的勾选。画面中的绿色路径消失,但连接器外框、线号和尺寸仍在;这说明正在调整图层显示,而不是把整个图纸关闭了。
完成检查后用 ShowAllLayers True 恢复。如果宿主需要保留原来就隐藏的图层,不应一律“全部显示”,而应在修改前记录每个图层的可见性,再逐项恢复。记录以当前文件为范围,加载新图后重新建立,不把旧图层索引当成通用编号。
5.2 大量图层时自建列表
对于层数很多的工程图,弹出菜单不便搜索。宿主可以遍历 LayerCount,读取每一项 LayerName、LayerColor 和 LayerVisible,组成自己的列表,增加名称搜索与勾选框。勾选变化调用 SetLayerVisible,再请求重绘。列表中应区分“按名称查找”和“索引编号”,因为不同图纸同名图层的索引也可能不同。
控件内图层状态主要用于当前显示。若用户要求把这些显隐规则保存到源 DWG 或 DXF,本控件当前没有相应保存能力;宿主可另存自己的显示偏好文件,但必须注明那是宿主配置,不是 CAD 图纸编辑结果。
5.3 颜色和线宽的结果判断
切换黑白显示前先观察一条路径和一个尺寸对象,切换后它们的颜色应按当前绘制模式变化。背景很亮而线色也很亮时,显示中可能进行可读性处理,不能把屏幕取色直接当成源图颜色数据库。需要源颜色业务处理时读取图层信息,并为特殊继承规则保留检查空间。
线宽显示用于更接近图纸视觉效果,但在很小的窗口里粗线可能遮挡细节。可以放大同一局部比较开启与关闭线宽的效果;不应为了让一张缩略图更清楚而把用户原图线宽永久改小。
5.4 开发者遍历图层的示例
图层索引从 0 开始,有效范围为 0 到 LayerCount-1。图层可见性是当前控件中的显示状态,不是将源文件中的图层重新保存。
Dim i As Long
For i = 0 To CADViewXJL1.LayerCount - 1
Debug.Print CADViewXJL1.LayerName(i), _
CADViewXJL1.LayerVisible(i), _
CADViewXJL1.LayerColor(i)
Next
If CADViewXJL1.LayerCount > 0 Then
CADViewXJL1.SetLayerVisible 0, False
End If
CADViewXJL1.ShowAllLayers TrueLayerName(Index) 是带索引属性,LayerVisible(Index)、LayerColor(Index) 是方法。索引错误会返回 COM 错误,宿主应使用当前图纸重新获取数量,不沿用上一个文件的索引。
6. 坐标拾取与业务叠加
6.1 先做一个点的往返验证
选择控件客户区中央一个像素点,分别调用 ScreenToCADX 和 ScreenToCADY,得到对应 CAD 坐标,再把该坐标同时传给 CADToScreenX 和 CADToScreenY。返回像素应该回到同一个位置或仅有整数取整误差。若相差一个控件左上角偏移,通常是客户区和父窗口坐标混用了。
重复这个检查时,应选左上、中心、右下三个不同位置,并分别在零度和九十度视图中进行。只测中心点可能掩盖比例或旋转错误;只测零度又可能掩盖轴方向错误。把测试点画到宿主自己的临时层时,还要确认宿主覆盖物不会拦截控件本来的鼠标输入。
6.2 高 DPI 工位的检查表
将窗口放到实际使用的显示器,在当前系统缩放下测试点选和坐标。若运行环境使用多个不同缩放的显示器,移动窗体后重新做一次,不沿用启动时假定的像素比例。开发者应检查宿主的 DPI 声明、控件客户区尺寸以及输入事件的单位,而不是让最终用户靠鼠标偏移补偿。
一次完整检查包括:鼠标位置、事件返回值、转换后的 CAD 坐标、转换回来的像素、临时提示显示位置。只有这几项对齐,才能把该坐标用于后续业务查询。控件提供坐标换算不等于已经提供对象拾取、实体修改或数据库级对象标识。
6.3 如何写清业务坐标
建议宿主状态栏同时注明单位和坐标系,例如“图纸坐标 X=250.000,Y=150.000,单位 mm”,不要只显示两个没有单位的数字。毫米应来自对图纸单位的理解,不是因为某个显示属性中出现了 mm 字样。屏幕缩放倍数与图纸实际长度是不同信息,分别展示更容易排查问题。
6.4 换算接口与输入单位
CAD 坐标与屏幕坐标转换接口为:
ScreenToCADX(X, Y) ScreenToCADY(X, Y) CADToScreenX(X, Y) CADToScreenY(X, Y)
屏幕参数是控件客户区坐标,勿直接传桌面坐标或 VB6 窗体 Twips。宿主使用 Twips 时,应先转换成对应像素。读取鼠标事件和转换结果后,在 100%/125%/150% 缩放及旋转视图下验证同一个已知点的正反转换。
7. 保存和复制当前画面
7.1 先确定要保存的视图
输出当前视图前先选择方向,调整到合适缩放,并决定是否显示某些辅助图层。需要整张图时执行全图;需要局部时放大并平移到目标。确认没有弹出菜单遮住控件,窗口也没有最小化,再执行导出。
保存对话框由示例宿主提供。文件名示例为“当前视图.bmp”,格式为 BMP;选择可写目录并点击保存。正式宿主可以使用同样的接口,把最终路径交给 ExportViewToBMP,但应在覆盖已有文件前让用户看清目标。
7.2 保存后做一次独立检查
检查函数返回 True,再检查目标文件存在且大小合理,最后用图像查看程序打开。观察旋转方向、文字、边缘和当前图层是否与控件一致。只有返回值而没有文件检查,不足以证明业务交付完成;反过来,有文件但内容是空白也不能算成功。
位图记录的是当前窗口像素,不具备矢量图纸任意放大的精度。打印到大幅面时容易看到像素边缘,这是位图流程的天然限制,不应向用户承诺它与原生 CAD 矢量打印相同。若用户需要可编辑图纸或精确工程打印,应采用有相应功能的 CAD 产品。
7.3 剪贴板复制的用途
“复制位图”适合将当前画面粘贴到报告、邮件草稿或宿主自己的图像控件。复制后在目标图像区域实际粘贴,检查没有把上一次的剪贴板内容误当成本次输出。宿主若要自动读取,应确认格式与复制结果,并避免在失败时继续使用旧位图。
这一步只产生图像;不会自动发送邮件、上传图纸或共享文档。对包含客户图纸的正式业务,应由宿主和用户决定允许的接收范围。手册演示图是专门制作的练习数据,可以用于学习这些操作。
7.4 开发者导出位图的示例
If Not CADViewXJL1.ExportViewToBMP("D:\Drawing\current-view.bmp") Then
MsgBox "位图输出失败,请检查控件窗口和目标目录。"
End IfExportViewToBMP 输出当前控件客户区的 BMP,分辨率与当前窗口大小有关;它不是矢量 DWG/DXF 输出。导出前让控件正常显示、设置所需视图并重绘,目标目录应已存在且可写;同名目标可能被覆盖。不要在控件被最小化或不可见时假定获得了可用高分辨率图。CopyToRaster 或右键“Copy Current View”用于复制位图到系统剪贴板。核查返回值并在图像程序中实际粘贴检查,内容应与当前视图一致。
8. 打印与 CAD 保存的实际能力
8.1 不要让“调用成功”变成“打印成功”
当前 PrintImage 调用后可能正常返回,但它只进入位图复制流程。示例宿主将这件事直接写在结果区,并显示 PrintersCount 的当前结果。这里没有打印机选择窗口,也不会凭这一步产生纸张输出。
自己的产品若确实需要一个“打印”按钮,应将位图取得、打印机选择、纸张设定、页边距和最终提交连接起来。用户取消打印对话框时,应显示已取消,不能显示完成;打印机离线、缺纸等后续状态也应由宿主的打印方案处理。没有实际打印机测试时,手册应把它列为待验收集成功能。
8.2 保存 CAD 文件的拒绝结果
示例宿主保留“保存接口边界”按钮,供开发者看见 SaveToFile 的真实未实现错误。这个按钮不是给普通用户使用的正式保存入口。当前控件不提供把图纸另存为 DWG/DXF 的能力,也不会因为参数扩展名换成 .dxf 就支持转换。
正式宿主应隐藏或禁用这些不支持的产品动作,或者明确跳转到另一个经过验收的转换功能。不要吞掉 E_NOTIMPL 后显示“已保存”,不要仅创建一个空的同名文件以满足存在性检查,也不要把 BMP 改扩展名冒充 CAD 输出。
8.3 打印和保存接口的对照
当前 Print 和 PrintImage 只调用位图复制流程,不弹打印机对话框,也不直接将任务提交给打印机。 PrintersCount 当前返回 0;不要把这些兼容接口描述成已完成打印功能。
需要打印时由宿主提供打印流程,例如先 CopyToRaster,确认剪贴板得到位图,再由 VB6 的 Printer.PaintPicture 等宿主能力放到目标纸张。纸张、方向、缩放和打印机异常处理由宿主负责;实际打印机必须另行验收。
当前 SaveToFile、SaveToFileEx、SaveCopyToFile 返回 E_NOTIMPL,不保存 DWG 或 DXF。GetSaveDialogFilter 虽包含历史格式名称,也不证明保存实现存在。ConvertCADToJPEG 当前返回 False;本轮明确可用的文件型画面导出是 ExportViewToBMP。
块、文字、曲线及填充按受支持路径进行 2D 预览。POINT 构造点不作为可见十字显示;特殊填充、隐藏属性、弧线和旋转文字仍需用代表性图纸核对。兼容接口名称不表示完整复制其他厂商功能。
9. 处理事件与关闭宿主
当前类型库提供 ICADViewXJLEvents。集成时由 VB6 事件下拉框或类型库生成准确签名,不用其他控件的事件名代替。
| 事件 | 宿主建议用途 |
|---|---|
| OnBeforeLoad / OnAfterLoad | 清理自己的旧列表、在成功加载后读取新状态 |
| OnProgress | 显示阶段和提示;失败也可能发出结束阶段,不能仅凭阶段判断成功 |
| OnMouseDown / OnMouseUp / OnMouseMove | 获取客户区输入并转成 CAD 坐标 |
| OnMouseWheelUp / OnMouseWheelDown | 需要时接管滚轮;Handled 为可回写参数 |
| OnKeyDown / OnKeyPress | 按事件真实类型处理键盘输入 |
| OnScaling | 更新宿主显示的比例/视图信息 |
| OnToolButtonClick | 观察被调用的工具动作;事件触发不保证每个历史枚举都有实现 |
避免在 OnBeforeLoad、OnAfterLoad 或绘制回调中再次同步加载同一文件造成递归。也不要从任意后台线程直接操纵同一个 Apartment COM 控件;将 UI 调用安排回宿主所属线程。
窗体关闭时释放控件和相关事件引用。不要保留已关闭图纸的索引或旧状态。企业授权适用时,正常卸载会停止心跳;强制终止后的席位由服务器租约期限回收。
10. 分发更新与网页版区别
10.1 免注册 COM
设计器一般仍需注册;终端宿主可按包内 VB6App.exe.manifest.template 验证 Registration-Free COM:
1.将终端 EXE、同版 OCX 与解析器放在预定分发目录。
2.复制清单模板,按照宿主的实际 EXE 文件名配置清单,例如 MyApp.exe.manifest;模板中的应用身份按宿主调整。
3.保留 x86 体系、OCX 文件名及下面的 CLSID/类型库标识,不把它们改成其他预设的 GUID。
4.如果 EXE 已有嵌入清单,应按宿主构建方法合并,不能假定外部清单一定覆盖已有清单。
5.在未注册控件的隔离终端验证创建、加载和退出,再决定正式分发。实际宿主验证尚未完成时,不能仅以模板存在声称部署通过。
10.2 准确的控件身份
| 标识 | 本轮值 |
|---|---|
| ProgID | CADViewXJLLib.CADViewXJL |
| CLSID | {7A72E99F-F320-48ED-BC67-A8A6F1128F87} |
| 类型库 LIBID | {7B72CE74-D9F0-497D-8EE7-9BADBC738C0D} |
| 库 / 类 | CADViewXJLLib / CADViewXJL |
| 默认接口 / 事件接口 | ICADViewXJL / ICADViewXJLEvents |
不要使用其他构建预设的 CADViewLib.CADViewX 作为本包 ProgID,也不要直接替换其他产品 OCX。
10.3 更新和卸载
关闭宿主后再更新,OCX 和解析器必须同版,不混入旧 DLL/OCX。测试新版本使用独立目录,保留上一已验证包;注册路径变化后应使用新目录脚本重新注册并验证。
注销范围与注册范围匹配:当前用户运行 unregister-user.cmd;全机器范围由管理员运行 unregister-machine-admin.cmd。先注销再移走文件,避免留下失效注册路径。免注册终端按自身安装器移除文件,不必额外创建全机器注册项。
10.4 与网页预览版本的区别
网页通过浏览器选择本地 DWG/DXF 并显示预览。按当次发布页面提供的缩放、图层和旋转入口操作;OCX 的注册、VB6 事件和本地输出路径不能套用于网页。
网页部署单独核对 WASM、脚本和字体资源。浏览器预览与桌面解析器分开记录验收,不能用其中一个的测试数量代表另一个。网页账户访问门禁也不代表浏览器可下载的代码无法被有技术能力的用户提取。
11. 故障检查与交付练习
“无法插入对象”先区分三类问题:宿主位数、控件注册、Office 安全策略。当前 OCX 需要 32 位 Windows 宿主;64 位 Windows 上也可以安装 32 位 Office,因此不能只看操作系统位数。
| 现象 | 先做的检查 | 下一步 |
|---|---|---|
| VB6 能打开,Excel 不能插入 | 确认 Excel 自身为 32 位,并核对工作簿来源和组织策略 | 由 IT 按受信任文件和组织策略处理;不要全局关闭 ActiveX、宏或杀毒防护。 |
| 工作表可用,UserForm 不可用 | 确认所有 Office / VB6 进程已退出后,再运行同包注册脚本 | 重新打开工作簿,在工作表与 UserForm 分别执行插入、保存、关闭、重开、加载图纸。 |
| 更新后属性或行为仍旧 | 核对实际加载的 OCX 路径,以及配套解析器是否来自同一完整包 | 关闭占用进程后更新;保留 LastLoadError 错误原文。 |
微软说明 Microsoft 365 / Office 2024 默认禁用 ActiveX,Mac 与网页版本不支持该控件机制;32 位 ActiveX 控件不能直接加载到 64 位 Office。现场是否允许使用,应以目标设备的实际设置为准。
| 问题 | 核查顺序 |
|---|---|
| 注册失败或找不到类 | 脚本与注册范围、OCX实际路径、x86宿主及32位注册程序 |
| 64位程序无法加载 | 当前OCX为x86,应使用匹配宿主或另行取得64位产品 |
| 开发授权未生效 | OCX同目录config.ini、产品CadViewX、当前机器、签名与期限 |
| LoadFile没有报异常却空白 | 检查Active、控件错误画面、文件是否存在及解析结果 |
| 大图失败 | 配套解析器是否同版完整、文件完整性、内存及错误信息 |
| 文字很小看不到 | 放大核对;概览可能跳过亚像素文字;检查字体和样图 |
| 坐标偏移 | 客户区/桌面/Twips是否混用,系统缩放、视图旋转与父窗口布局 |
| 图层索引越界 | 加载新图后重新读取LayerCount,不沿用旧索引 |
| 保存DWG/DXF失败 | 本轮不实现CAD文件保存,使用源CAD或转换产品 |
| Print调用后没打印 | 当前只是复制位图,宿主需另写实际打印流程 |
| 位图空白/输出失败 | 控件是否正常可见,已加载、已重绘,目标目录可写 |
| 更新后行为不一致 | 检查实际注册路径、进程是否仍加载旧控件、OCX和解析器版本 |
11.1 开发机与终端分开验收
开发机主要验证设计器插入、控件属性、扫码或离线开发授权以及事件签名。终端主要验证位数、依赖、注册或免注册部署、业务打开与关闭、错误恢复和打印方案。两者授权契约不同,因此验收记录也分开写。
一个清楚的终端记录至少包含宿主版本、控件版本、解析器版本、Windows 版本、系统缩放、测试文件和结果。升级时对比上一份记录,尤其注意实际注册路径是否仍指向旧目录。仅替换文件名而没有重新检查路径,很容易造成“打包的是新控件,运行的是旧控件”。
11.2 一次可执行的回归路线
先打开小 DXF,确认 Active 与全图;旋转后适应窗口;切换一个图层再恢复;对三处像素做坐标往返;导出一张 BMP 并打开检查;复制一张位图;模拟不存在文件后再打开正常图;关闭图纸;最后退出宿主并重新启动。需要大图时,再单独增加独立解析的耗时和错误检查。
上述步骤应使用固定的演示文件,结果容易对比。真实客户图纸可以作为第二组兼容性样本,但不要把客户文件和个人授权配置放入公开说明书素材目录。问题复现材料可以先删除与问题无关的对象,再确认精简后的文件仍能复现。
11.3 提交问题时带哪些信息
打开失败提供控件画面中的错误、宿主看到的 Active 值及文件是否存在;图层问题提供名称和当前可见性;坐标问题提供输入像素、系统缩放和转换结果;位图问题提供保存返回值、文件大小和正常窗口截图。这样维护人员能够沿着同一操作顺序复现,而不是只看到一句“控件不能用”。
11.4 把说明书变成宿主里的帮助入口
使用带本轮帮助功能的新构建时,先单击中央控件取得焦点,再按 F1,可在默认浏览器打开随包的本地操作手册。注册窗口中的 F1 对应注册章节。先前已经发布的 OCX 没有这项快捷键,仅复制手册文件不会为旧控件增加 F1;需要配套更新控件和 help 文件夹。
如果按下 F1 没有打开本书,先确认键盘焦点在控件或注册窗口,再检查宿主是否拦截了这个按键。新包中应完整保留 help/cadviewx/ 与 help/assets/,文件缺失时按配套版本恢复。离线帮助打开后,点击左侧目录跳转,使用查找框搜索按钮,点击截图查看放大图;按 Esc 关闭放大图并回到正文。
宿主可以在自己的帮助按钮中定位到打开、图层、坐标或输出章节。用户正在查看图纸时,应保留图纸窗口的当前位置,不为了显示帮助再次加载文件。解释错误时给出下一步,例如“检查配套解析器后重新打开”,比仅显示一个错误编号更容易执行。对不支持的保存操作,帮助入口应直接说明格式边界,避免用户反复尝试同一个动作。
维护人员更新控件后,还应更新宿主帮助中显示的版本和截图。若正式宿主的按钮名称与本示例不同,在自己的操作说明中采用实际名称;不要让用户按本示例寻找宿主没有提供的工具条。中央预览能力可以复用,外围业务流程仍由每个宿主的产品设计决定。
本版正文只引用经格式检查确认的真实 PNG。图 3 至图 5 的三张宿主界面图分别为 2300 × 1050、1720 × 800 和 1210 × 750 像素,两张注册窗口图为 936 × 848 像素;生成 Word 与网页时不重采样、不重新编码,也不把低清旧图放大冒充高清图。图源尺寸与 SHA-256 记录在生成回执中。
配套练习文件
先把练习文件保存到自己的练习文件夹,再按正文操作。示例文件用于熟悉功能,不含可用于激活的软件授权。