麻烦在Excel VSTO应用

问题描述:

我加入一个Wi​​nForms控制到Excel工作表调整大小的WinForm控件。控制从ListView控件继承和简单地“抓”的右下角,像这样增加了用户调整它的能力:麻烦在Excel VSTO应用

//This solution taken from 
//http://*.com/questions/1535826/resize-borderless-window-on-bottom-right-corner/1535943#1535943 
public class MyListView : ListView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     const int wmNcHitTest = 0x84; 
     const int htBottomLeft = 16; 
     const int htBottomRight = 17; 
     if (m.Msg == wmNcHitTest) 
     { 
      int x = (int)(m.LParam.ToInt64() & 0xFFFF); 
      int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); 
      Point pt = PointToClient(new Point(x, y)); 
      Size clientSize = ClientSize; 
      if (pt.X >= clientSize.Width - 16 && pt.Y >= clientSize.Height - 16 && clientSize.Height >= 16) 
      { 
       m.Result = (IntPtr)(IsMirrored ? htBottomLeft : htBottomRight); 
       return; 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

此控件被添加到我的工作表:

MyListView listView = new MyListView(); 

Microsoft.Office.Tools.Excel.Worksheet worksheet = 
    Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveWorkbook.Sheets[1]); 

worksheet.Controls.AddControl(listView, 0, 0, 100, 100, "myListView01"); 

有了这个,我可以通过抓住右下角并将其向左/向上拖动来缩小控制。

的问题是,我不能让它大,因为它不会允许拖动光标过去MyListView的右边/底部的边框。做一些调查,我相信这是发生因为获得通过VSTO添加到工作表的所有控制由一个名为VSTOContainerControl控制,谁的规模一直被设置为相同的,因为它的子控件的子。这个事实在MSDN博客here上得到确认。我发现,如果我编程增加母体VSTOContainerControl的大小,孩子MyListView自动增加为好。但是,我需要用户能够随意手动增加大小。我怎样才能做到这一点?

我建议把ListView和容器控件之间的小幅度,足以让你可以拖动缩放柄几个像素,和编程固定容器的大小,以新的大小+保证金。容器大小调整可以在事件处理程序中完成,以便在用户尝试执行大小调整时触发任何事件。