您的位置:首页 > 汽车 > 时评 > VB.net 进行CAD二次开发(二)

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

2024/7/7 9:24:52 来源:https://blog.csdn.net/u011115875/article/details/139279228  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com