开发者

Transparent Controls In VSTO

开发者 https://www.devze.com 2023-03-29 17:56 出处:网络
I\'m trying to add some windows forms controls to a worksheet using vsto.I\'d like them to be transparent though (so that the actual content in Excel is visible).

I'm trying to add some windows forms controls to a worksheet using vsto. I'd like them to be transparent though (so that the actual content in Excel is visible).

My winforms user control constructor looks like this:

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

I'm adding the control like this:

void Application_WorkbookOpen(Excel.Workbook Wb)
{
  var nativeSheet = Wb.ActiveSheet as Excel.Worksheet;

  if (nativeSheet != null)
  {
    var tag = new T开发者_开发技巧ag();
    var vstoSheet = nativeSheet.GetVstoObject();
    var range = nativeSheet.Range["A1", missing];
    vstoSheet.Controls.AddControl(tag, range, Guid.NewGuid().ToString());
  }
}

If there's some content cell A1, it will be covered by the control (the cell will just appear as plain white).

Anybody have any ideas on this?


As mentioned over at MSDN:

When a Windows form control are hosted on Office document, the control is not directly embedded in the document. An ActiveX control called the Windows Forms control host is added to document surface first and the control host acts as a host for each Windows Form control added too the document.

You can see for yourself:

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...          
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消