透明的VSTO控制

本文关键字:控制 VSTO 透明 | 更新日期: 2023-09-27 18:06:17

我试图使用vsto添加一些windows窗体控件到工作表。我希望它们是透明的(以便在Excel中的实际内容是可见的)。

我的winforms用户控件构造函数是这样的:

    public Tag()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
        BackColor = Color.Transparent;
    }

我像这样添加控件:

void Application_WorkbookOpen(Excel.Workbook Wb)
{
  var nativeSheet = Wb.ActiveSheet as Excel.Worksheet;
  if (nativeSheet != null)
  {
    var tag = new Tag();
    var vstoSheet = nativeSheet.GetVstoObject();
    var range = nativeSheet.Range["A1", missing];
    vstoSheet.Controls.AddControl(tag, range, Guid.NewGuid().ToString());
  }
}

如果有一些内容单元格A1,它将被控件覆盖(单元格将显示为纯白色)。

有人对此有什么想法吗?

透明的VSTO控制

正如在MSDN中提到的:

当Windows窗体控件托管在Office文档上时,该控件没有直接嵌入到文档中。一个ActiveX控件Windows Forms控件主机首先被添加到文档表面,然后控件主机充当添加的每个Windows窗体控件的主机

你可以自己看:

var btn = new ImageButton();
btn.Name = "link1";
btn.Text = controlText;
btn.Click += new EventHandler(btn_Click);
vstoWorksheet.Controls.AddControl(pic, nativeWorksheet.Range[address], controlText);

 public class ImageButton : Control, IButtonControl
    {
        public ImageButton()
        {
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            SetStyle(ControlStyles.Opaque, true);
            SetStyle(ControlStyles.ResizeRedraw, true);
            this.BackColor = Color.Transparent;
        }
        protected override void OnPaint(PaintEventArgs pevent)
        {
            Graphics g = pevent.Graphics;
            g.DrawRectangle(Pens.Black, this.ClientRectangle);
        }    
        protected override void OnPaintBackground(PaintEventArgs pevent)
        {
            // don't call the base class
            //base.OnPaintBackground(pevent);
        }    
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_TRANSPARENT = 0x20;
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_TRANSPARENT;
                return cp;
            }
        }    
        // rest of class here...          
    }