文采不好,就直接来点源码希望个位开发者喜欢:
public static PaletteSet paletteSet = null;
public static void CreateWigPlatte(System.Windows.Forms.Form frm, bool Visiable = true, DockSides dock = DockSides.Left)
{
//初始化项目面板
if (paletteSet == null)
{
paletteSet = new PaletteSet("LTYTool");
paletteSet.Dock = dock;
paletteSet.Visible = Visiable;
}
if (paletteSet.Count > 0)
paletteSet.Remove(0);
paletteSet.Add(frm.Text, frm);
frm.Visible = true;
paletteSet.SetSize(frm.Size);
if (frm != null)
{
frm.Dock = System.Windows.Forms.DockStyle.Fill;
}
}
这里我把PaletteSet定义了一个全局的对象,不断的加载不同的Form,并改变paletteSet的大小。
但是如果不做其他处理,上面的代码会在“paletteSet.Add(frm.Text, frm);”抛出异常,异常信息如下:
我再把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)
在 TYLinCivil3DTool.PletteSetManage.CreateWigPlatte(Form frm, Boolean Visiable, DockSides dock) 位置 C:\chenjiang\CODE\TYLinCivil3DTool\TYLinCivil3DTool\BaseOper\PletteSetManage.cs:行号 67
在 TYLinCivil3DTool.CommandMenu.TTest1() 位置 C:\chenjiang\CODE\TYLinCivil3DTool\TYLinCivil3DTool\Menus\CommandMenu.cs:行号 69
开始的时候个人认为肯定是Cad的api出现了bug,一直从api方面下手,找了两个小时左右,我觉得还是重新看看错误信息,大家注意,我已经把上面的信息有些文字加粗了
个人思路:
1.Control.set_BackColor 去查看paletteSet是不是,结果,它不是继承的System.Windows.Forms;那就只有我的参数System.Windows.Forms.Form frm的问题了,
2.结果我写了这么一行代码去测试“ frm.set_BackColor(**)”,可惜,连编译都不过,接着我有写了这么一行“form.BackColor = Color.Transparent;”,当然后面要跟一个透明的颜色哈,不然看不到效果。
3.结果类似的异常就出来了,最上面的两行都是:
在 System.Windows.Forms.Control.set_BackColor(Color value)
在 System.Windows.Forms.Form.set_BackColor(Color value)
离成功更进一步了。
4.在找找资料,如何让Form能够透明,很多答案我试了不行,这里分享一个有用的:
https://zhidao.baidu.com/question/156802845.html
在构造函数中调用窗体的 SetStyle。
SetStyle(ControlStyles.SupportsTransparentB_a_c_kColor, true);这将使控件能够支持透明背景色。
一切Over。
当然最后苦尽甘来,一切相安无事!