我正在将Winforms控件添加到Excel工作表中。该控件继承自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也会自动增加。然而,我需要用户能够随意手动增加大小。我怎样才能做到这一点?
我建议在列表视图和容器控件之间放一个小的边距,这样你就可以将调整大小的手柄拖动几个像素,并通过程序将容器的大小固定为新的大小+边距。容器大小调整可以在事件处理程序中完成,无论用户尝试调整大小时触发什么事件。