[C#]FormにFormをくっつける。

Formに操作用のFormを常にくっつけたい場合があります。

操作パネルFormがついてるコントロール
Img20121217165137

くっつける対象のFormが動いたりサイズが変更したりした場合、くっつくFormのポジションも当然変わりますので、イベントを追加してあげます。
Locationを変更する方法はいろいろなやり方があるので、一例を挙げます。

様々なポジションにFormをくっつける

位置別のLocationの求め方
Form1のウィンドウの周りにForm2の子ウィンドウを任意の場所に表示させる例を挙げます。Form1が移動したり、サイズが変更された時に、Form2にはその動きに追随するようにします。
Form1でForm2を生成した際に、Form2のOwnerにForm1を設定します。Form2でOwnerプロパティを使用し、Form1の位置(Boundsプロパティ)を参照し、自分が表示されるべきポジションを決めてやります。

Form2インスタンス生成時のOwnerの設定

            var childForm = new Form2[16];
            
            for (int i = 0; i < 16; i++)
            {
                childForm[i] = new Form2(i);
                childForm[i].Owner = this;
                childForm[i].Show();
            }

Form2内からOwner(Form1)の位置(Bounds)を参照し、新しい位置を求める
Form2を表示させるべき位置はPointクラスで指定します。OwnerのBoundsプロパティで得られるForm1の位置はウィンドウ上の座標(X,Y)と幅(Width)と高さ(Height)です。これらとForm2の幅と高さを組み合わせることでForm2を表示すべき座標(X,Y)を求めます。

        private void SetLocation()
        {
            var pLocation = this.Owner.Bounds;
            var myLocation = new Point();

            switch (_formNo)
            {
                case 0: /// 左上角
                    myLocation.X = pLocation.X - this.Width;
                    myLocation.Y = pLocation.Y - this.Height;
                    break;
                case 1: /// 上辺左端
                    myLocation.X = pLocation.X;
                    myLocation.Y = pLocation.Y - this.Height;
                    break;
                case 2: /// 上辺真ん中
                    myLocation.X = (pLocation.X + (pLocation.Width / 2)) - (this.Width / 2);
                    myLocation.Y = pLocation.Y - this.Height;
                    break;
                case 3: /// 上辺右端
                    myLocation.X = pLocation.X + pLocation.Width - this.Width;
                    myLocation.Y = pLocation.Y - this.Height;
                    break;
                case 4: /// 右上角
                    myLocation.X = pLocation.X + pLocation.Width;
                    myLocation.Y = pLocation.Y - this.Height;
                    break;
                case 5: /// 右辺上端
                    myLocation.X = pLocation.X + pLocation.Width;
                    myLocation.Y = pLocation.Y;
                    break;
                case 6: /// 右辺真ん中
                    myLocation.X = pLocation.X + pLocation.Width;
                    myLocation.Y = (pLocation.Y + (pLocation.Height / 2)) - (this.Height / 2);
                    break;
                case 7: /// 右辺下端
                    myLocation.X = pLocation.X + pLocation.Width;
                    myLocation.Y = pLocation.Y + pLocation.Height - this.Height;
                    break;
                case 8: /// 右下角
                    myLocation.X = pLocation.X + pLocation.Width;
                    myLocation.Y = pLocation.Y + pLocation.Height;
                    break;
                case 9: /// 下辺右端
                    myLocation.X = (pLocation.X + pLocation.Width) - this.Width;
                    myLocation.Y = pLocation.Y + pLocation.Height;
                    break;
                case 10: /// 下辺真ん中
                    myLocation.X = (pLocation.X + (pLocation.Width / 2)) - (this.Width / 2);
                    myLocation.Y = pLocation.Y + pLocation.Height;
                    break;
                case 11: /// 下辺左端
                    myLocation.X = pLocation.X;
                    myLocation.Y = pLocation.Y + pLocation.Height;
                    break;
                case 12: /// 左下角
                    myLocation.X = pLocation.X - this.Width;
                    myLocation.Y = pLocation.Y + pLocation.Height;
                    break;
                case 13: /// 左辺下端
                    myLocation.X = pLocation.X - this.Width;
                    myLocation.Y = pLocation.Y + pLocation.Height - this.Height;
                    break;
                case 14: /// 左辺真ん中
                    myLocation.X = pLocation.X - this.Width;
                    myLocation.Y = (pLocation.Y + (pLocation.Height / 2)) - (this.Height / 2);
                    break;
                case 15: /// 左辺上端
                    myLocation.X = pLocation.X - this.Width;
                    myLocation.Y = pLocation.Y;
                    break;
                default:
                    break;
            }

            this.Location = myLocation;
        }

位置イメージ
Img20121217170442

OwnerのMoveイベントとSizeChangedイベントに処理を追加する
Fomr1へのイベントハンドラへの追加はForm2を生成した時に,Form2のコンストラクタが呼ばれた後にForm2のOwnerプロパティへの設定が行われるため、Form2のコンストラクタに処理を書くことはできません。なので、Loadイベントに記述します。

        private void Form2_Load(object sender, EventArgs e)
        {
            SetLocation(); /// 1回実行しておく
            this.Owner.Move += (sarg, earg) => SetLocation();
            this.Owner.SizeChanged += (sarg, earg) => SetLocation();
        }

今回作成したソースはこちら

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.