2011-08-22 73 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...   
    }