VB.net 进行CAD二次开发(二)

利用参考文献2,添加面板

执行treeControl = New UCTreeView()时报一个错误:

用户代码未处理 System.ArgumentException

HResult=-2147024809

Message=控件不支持透明的背景色。

Source=System.Windows.Forms

StackTrace:

在 System.Windows.Forms.Control.set_BackColor(Color value)

在 System.Windows.Forms.Form.set_BackColor(Color value)

在 Autodesk.AutoCAD.Windows.AcMgWinformPalette.ResyncToTheme(AcMgWinformPalette* )

在 Autodesk.AutoCAD.Windows.AcMgWinformPalette.Create(AcMgWinformPalette* , CAdUiPaletteSet* pParentWnd)

在 Autodesk.AutoCAD.Windows.PaletteSet.AddCore(String name, AcMgPalette* pPal)

在 Autodesk.AutoCAD.Windows.PaletteSet.Add(String name, Control control)

在 odpmMagProcess.Palettes.Palettes.ShowPalette() 位置 D:\testVBNet\ODPM\odpmMagProcess\Class3.vb:行号 28

在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)

在 Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)

在 Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)

在 Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()

InnerException:

搜索了1天关于这个问题的解决方案,并且尝试了这些方案,都没有很好地解决这个问题。

半拉子的解决办法是,给UCDockDrag和UCTteeView添加了构造函数

UCDockDrag.vb

Public Sub New()

' 此调用是设计器所必需的。

InitializeComponent()

' 在 InitializeComponent() 调用之后添加任何初始化。

SetStyle(ControlStyles.SupportsTransparentBackColor, True)

comboBoxDock.BackColor = Color.Red

textBoxDrag.BackColor = Color.Red

Me.BackColor = Color.Red

Me.TransparencyKey = Me.BackColor

End Sub

UCTteeView.vb

Public Class UCTreeView

Public Sub New()

' 此调用是设计器所必需的。

InitializeComponent()

' 在 InitializeComponent() 调用之后添加任何初始化。

SetStyle(ControlStyles.SupportsTransparentBackColor, True)

treeViewEnts.BackColor = Color.Red

dataGridViewEnts.BackgroundColor = Color.Red

'TransparencyKey = Color.FromArgb(1, 0, 0, 0)

Me.BackColor = Color.Red

Me.TransparencyKey = Me.BackColor

End Sub

调试的结果如下:

使用用户控件以后,就没有问题了

面板内的控件都不显示。

换一种思路,搜索其他添加面板的方法。

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.Windows

Imports System.Windows.Forms

Namespace Palettes

Public Class Class4

<CommandMethod("CreatePalette")>

Public Sub CreatePalette()

'初始化面板集对象

Dim ps As PaletteSet = New PaletteSet("我的窗体")

ps.MinimumSize = New System.Drawing.Size(300, 300)

' 创建用户自定义的窗体或控件

Dim ctrl As UserControl = New UserControl()

'添加控件到面板集中

ps.Add("My Tab01", ctrl)

ps.Add("My Tab02", ctrl)

'显示面板

ps.Visible = True

'设置面板样式和透明度

ps.Style = PaletteSetStyles.ShowTabForSingle

ps.Opacity = 90

End Sub

End Class

End Namespace

图层选择

<CommandMethod("SelectLayer")>

Public Sub SelectLayer()

Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument

If Not doc Is Nothing Then

Dim ps As PaletteSet = New PaletteSet("Select Layer")

ps.Style = PaletteSetStyles.ShowAutoHideButton Or PaletteSetStyles.ShowCloseButton

ps.Size = New System.Drawing.Size(200, 100)

Dim comboBox As System.Windows.Forms.ComboBox = New System.Windows.Forms.ComboBox()

For Each layer As LayerTableRecord In GetLayerList()

comboBox.Items.Add(layer.Name)

Next

Dim okButton As System.Windows.Forms.Button = New System.Windows.Forms.Button()

okButton.Text = "OK"

AddHandler okButton.Click,

Sub(sender, e)

Dim selectedLayer As String = comboBox.SelectedItem.ToString()

Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Selected Layer: " + selectedLayer)

End Sub

Dim panel As System.Windows.Forms.Panel = New System.Windows.Forms.Panel()

panel.Controls.Add(comboBox)

panel.Controls.Add(okButton)

ps.Add("Select Layer", panel)

ps.Visible = True

End If

End Sub

VS2013 的MSDN文档的ISO下载和安装见参考文献6

参考文献

AutoCAD C# 自动加载自定义RibbonUI界面_怎么给autocad换ui-CSDN博客

VB.net 关于给autoCAD添加 面板_application.getsystemvariable("menuname")-CSDN博客

https://bbs.csdn.net/topics/80039904

C# CAD交互界面-自定义面板集-comboBox选择图层_cad c#-CSDN博客

C# CAD交互界面-自定义面板集(四) - 技术栈

https://www.cnblogs.com/strangekitty/p/4707400.html

C#中=>使用_c# =>-CSDN博客

AddHandler 语句 - Visual Basic | Microsoft Learn

VB.NET 中动态添加按钮并添加点击事件-CSDN博客

Lambda 表达式 - Visual Basic | Microsoft Learn

相关推荐
步步为营DotNet1 小时前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
一个帅气昵称啊2 小时前
基于.NET的NetCoreKevin框架中AgentFramework实现AI智能体Skill和工具动态管理和加载
.net
魏杨杨11 小时前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
AI行业学习20 小时前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.19】
.net
切糕师学AI1 天前
.NET 中 CallerMemberName 与 StackTrace 的深度对比
.net·调用栈·stacktrace·callermember
步步为营DotNet1 天前
解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践
微服务·asp.net·.net
唐青枫1 天前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
c#·.net
rockey6272 天前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
叫我少年2 天前
ASP.NET Core 最小 API 快速参考
.net·api
步步为营DotNet2 天前
深入.NET 11:C# 14 在边缘计算数据处理的优化与实践
c#·.net·边缘计算