2

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 も自動的に大きくなることがわかりました。ただし、ユーザーが手動でサイズを自由に大きくできるようにする必要があります。どうすればこれを達成できますか?

4

1 に答える 1

0

リストビューとコンテナコントロールの間に小さなマージンを入れて、サイズ変更ハンドルを数ピクセルドラッグし、プログラムでコンテナのサイズを新しいサイズ+マージンに固定できるようにすることをお勧めします。コンテナのサイズ変更は、ユーザーがサイズ変更を行おうとしたときに発生するイベントのイベントハンドラーで実行できます。

于 2013-01-21T17:02:30.600 に答える