2011-08-22 75 views
3

我正在尝试使用vsto将一些窗体控件添加到工作表中。我希望它们是透明的(因此Excel中的实际内容是可见的)。VSTO中的透明控件

我的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,它会通过控制覆盖(该单元格将显示为纯白色)。

有人有什么想法吗?

+0

+1,但是一些微软的人都[否定的回答了这个(http://social.msdn.microsoft.com/Forums/br/ VSTO /线程/ 20d3fe58-2bf4-49d3-8255-b0e3b32a42cc)... –

回答

0

截至MSDN提到过:

当Windows窗体控件是在Office文档托管,控制 没有直接嵌入到文档中。一个叫做 的Windows控件主机被添加到文件表面,并且控制主机也作为每个Windows Form控件的主机添加 太文件。

您可以看到自己:

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