在 C# AutoCAD 二次开发中,退出已加载的 Windows 窗口(如 WinForms 或 WPF 窗体)的核心方法是调用窗体的Close()方法或设置DialogResult属性。具体实现取决于窗口的显示方式(模态或非模态)以及是否需要与 AutoCAD 命令流交互。
1. 模态窗口的退出
模态窗口使用ShowDialog()显示,退出时应设置DialogResult或直接调用Close()。
代码示例:
// 假设你的窗体类名为 MyForm public partial class MyForm : Form { private void btnOK_Click(object sender, EventArgs e) { // 执行你的逻辑... this.DialogResult = DialogResult.OK; // 设置对话框结果会自动关闭窗口 // 或者直接调用 this.Close(); } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; // 或者直接调用 this.Close(); } } // 在 AutoCAD 命令中调用[CommandMethod("ShowMyDialog")] public void ShowMyDialog() { using (MyForm form = new MyForm()) { DialogResult result = Application.ShowModalDialog(form); // 根据 result 处理后续逻辑 } }2. 非模态窗口的退出
非模态窗口使用Show()显示,必须显式调用Close()来退出,并需妥善管理窗口生命周期。
代码示例:
public partial class MyModelessForm : Form { // 持有窗体实例的静态引用,便于管理 private static MyModelessForm _instance; [CommandMethod("ShowModelessForm")] public static void ShowModelessForm() { if (_instance == null || _instance.IsDisposed) { _instance = new MyModelessForm(); _instance.Show(); } else { _instance.Activate(); } } // 窗体内部的关闭按钮事件 private void btnClose_Click(object sender, EventArgs e) { this.Close(); // 关闭当前窗体实例 } // 重写 OnFormClosed 以清理静态引用 protected override void OnFormClosed(FormClosedEventArgs e) { _instance = null; base.OnFormClosed(e); } } // 你也可以通过一个命令来主动关闭非模态窗口 [CommandMethod("CloseModelessForm")] public static void CloseModelessForm() { if (_instance != null && !_instance.IsDisposed) { _instance.Close(); _instance = null; } }3.关键注意事项对比表
| 特性 | 模态窗口 (ShowDialog) | 非模态窗口 (Show) |
|---|---|---|
| 显示方法 | Application.ShowModalDialog(form)或form.ShowDialog() | form.Show() |
| 阻塞性 | 阻塞 AutoCAD 命令流,等待窗口关闭 | 不阻塞,与 AutoCAD 并行运行 |
| 退出方式 | 设置DialogResult或调用Close() | 必须显式调用Close() |
| 生命周期管理 | 通常使用using语句自动释放 | 需手动管理实例,防止内存泄漏或重复创建 |
| 适用场景 | 需要用户立即响应、中断当前操作的对话框 | 需要持续显示、与绘图区交互的工具面板 |
4. 确保与 AutoCAD 应用程序集成的关闭
如果你的窗口需要响应 AutoCAD 事件(如文档关闭)或确保在 AutoCAD 退出时清理资源,可以订阅相应事件。
代码示例:
public partial class MyAutoCADForm : Form { public MyAutoCADForm() { InitializeComponent(); // 订阅 AutoCAD 应用程序或文档关闭事件 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.DocumentDestroyed += DocumentManager_DocumentDestroyed; this.FormClosed += MyAutoCADForm_FormClosed; } private void DocumentManager_DocumentDestroyed(object sender, Autodesk.AutoCAD.ApplicationServices.DocumentDestroyedEventArgs e) { // 当文档关闭时,可以决定是否关闭窗体 if (/* 你的判断条件 */) { this.Invoke(new Action(() => this.Close())); } } private void MyAutoCADForm_FormClosed(object sender, FormClosedEventArgs e) { // 清理事件订阅,防止内存泄漏 Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.DocumentDestroyed -= DocumentManager_DocumentDestroyed; } }核心要点总结:
- 模态窗口:优先通过设置
this.DialogResult来关闭。 - 非模态窗口:必须调用
this.Close(),并妥善管理单例实例。 - 资源管理:使用
using语句或重写OnFormClosed方法确保窗体及其资源被正确释放。 - 事件清理:如果订阅了外部事件(如 AutoCAD 事件),务必在窗体关闭时取消订阅。
参考来源
- VC++实现SolidWorks二次开发:从环境搭建到插件实战
- C#调用llama.cpp运行PaddleOCR-VL本地OCR客户端
- SolidWorks 2026安装激活深度解析:FlexNet许可机制与Windows系统级适配
- AutoCAD 2025 完整安装与永久激活指南:从环境准备到功能验证
- SolidWorks 2025安装配置全解析:从系统兼容到许可服务深度适配