Прозрачный контроль в ВСТО - PullRequest
3 голосов
/ 23 августа 2011

Я пытаюсь добавить некоторые элементы управления формами Windows на лист, используя vsto.Мне бы хотелось, чтобы они были прозрачными (чтобы фактическое содержимое в Excel было видно).

Мой конструктор пользовательского элемента управления winforms выглядит так:Элемент управления выглядит следующим образом:

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, она будет закрыта элементом управления (ячейка будет просто отображаться белым цветом).

1 Ответ

0 голосов
/ 23 августа 2012

Как уже упоминалось в 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...          
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...