2

我正在向 Excel 工作表添加一个 Winforms 控件。该控件继承自 ListView 并简单地添加了用户通过“抓取”右下角来调整其大小的能力,如下所示:

//This solution taken from 
//http://stackoverflow.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 博客证实了这一事实。我发现如果我以编程方式增加父 VSTOContainerControl 的大小,子 MyListView 也会自动增加。但是,我需要用户能够随意手动增加大小。我怎样才能做到这一点?

4

1 回答 1

0

我建议在列表视图和容器控件之间放置一个小边距,以便您可以将调整大小手柄拖动几个像素,并以编程方式将容器的大小固定为新的大小 + 边距。容器调整大小可以在用户尝试调整大小时触发的任何事件的事件处理程序中完成。

于 2013-01-21T17:02:30.600 回答