ユーザーコントロールをドラッグアンドドロップでサイズ変更

サイズ変更もほぼ移動と同じ要領でいけました。思ってたより簡単だった。よかったよかった。
今回も肝はMouseMoveです。さっきはLeft、Topを変更したけれど、今回はサイズなのでWidth、Heightを変更する。ただし、ある時は移動、ある時はサイズ変更としないといけないので、サイズ変更なのかどうか判定が必要となります。通常サイズ変更するときはコントロールの端っこを引っ張った時なので、MouseDownイベント時に端っこかどうかを判定(今回は簡単化のために、右、下、右斜め下のみサイズ変更可能とした。)すれば良い。

今回は移動の応用ってことなので詳細については解説しない。コードを読んでください。

        private Point point = new Point();
        private Cursor c;
        private bool isDraggable = false;
        private bool isResizable = false;

        private void ClassPicture_MouseDown(object sender, MouseEventArgs e)
        {
            Cursor.Current = GetCursor(e.X, e.Y);
            this.c = Cursor.Current;

            isDraggable = true;
            isResizable = Cursors.Default != Cursor.Current;

            point.X = e.X;
            point.Y = e.Y;
        }

        private void ClassPicture_MouseMove(object sender, MouseEventArgs e)
        {
            Cursor.Current = GetCursor(e.X, e.Y);

            if (isResizable)
            {
                if ( c == Cursors.SizeNS || c == Cursors.SizeNWSE )
                {
                    this.Height += e.Y - point.Y;
                }

                if ( c == Cursors.SizeWE || c == Cursors.SizeNWSE )
                {
                    this.Width += e.X - point.X;
                }

                point.X = e.X;
                point.Y = e.Y;
            }
            else if (isDraggable)
            {
                this.Left += e.X - point.X;
                this.Top += e.Y - point.Y;
            }
        }

        private Cursor GetCursor(int x, int y)
        {
            if ( isResizable ) return this.c;

            bool isRight = x >= this.Size.Width - 2 && x <= this.Size.Width-1;
            bool isBottom = y >= this.Size.Height - 2 && y<= this.Size.Height-1;

            if (isRight && isBottom) return Cursors.SizeNWSE;

            if ( isRight ) return Cursors.SizeWE;

            if ( isBottom ) return Cursors.SizeNS;

            return Cursors.Default;
        }

        private void ClassPicture_MouseUp(object sender, MouseEventArgs e)
        {
            isDraggable = false;
            isResizable = false;
        }

次にやらんといかんのは、Ctrキー押しながらの選択、つまり複数選択されている状態でそのうちの1つを移動・サイズ変更したときにそのほかの選択されているヤツもあわせて移動・サイズ変更するようにしないと。イベントリスナの登録とかか。うーん、先はまだ長いな。