2010年10月24日

フォームを画面の端に吸着させる方法(C#用メモ)

フォームが画面の端に近づいたときに、端に吸着(スナップ)させる方法。

基本的には力業です。
フォームをドラッグして移動させる方法』で紹介した方法を使います。
フォームを直接動かすのではなく、フォームの移動先の領域を定義しておき、それが画面の端に吸着しそうな距離であれば、吸着させます。
吸着しそうな距離かどうかは、“フォームの移動先の領域”と“画面の端の領域”を定義して、領域が重なっているかチェックします。
今回はRectangleのIntersectsWithを使用しましたが、if文で判定しても構いません。

//マウスが動いたとき
private void Form1_MouseMove(object sender,
    System.Windows.Forms.MouseEventArgs e)
{
    if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
    {
        // 吸着するサイズ
        Size gap = new Size(16, 16);

        // 移動先のフォーム位置
        Rectangle newPosition = new Rectangle(
            this.Left + e.X - mousePoint.X,
            this.Top + e.Y - mousePoint.Y,
            this.Width,
            this.Height);
        // 判定用のRECT
        Rectangle newRect = new Rectangle();

        // 作業領域の取得(この作業領域の内側に吸着する)
        Size area = new Size(
            System.Windows.Forms.Screen.GetWorkingArea(this).Width,
            System.Windows.Forms.Screen.GetWorkingArea(this).Height);

        // 画面端の判定用(画面の端の位置に、吸着するサイズ分のRECTを定義する)
        Rectangle rectLeft = new Rectangle(
                                    0, 
                                    0, 
                                    gap.Width, 
                                    area.Height);
        Rectangle rectTop = new Rectangle(
                                    0, 
                                    0, 
                                    area.Width, 
                                    gap.Height);
        Rectangle rectRight = new Rectangle(
                                    area.Width - gap.Width, 
                                    0, 
                                    gap.Width, 
                                    area.Height);
        Rectangle rectBottom = new Rectangle(
                                    0, 
                                    area.Height - gap.Height, 
                                    area.Width, 
                                    gap.Height);
        // 衝突判定
        // 判定用のRECTを自分のウィンドウの隅に重ねるように移動し、
        // 画面端の判定用のRECTと衝突しているかチェックする。
        // 衝突していた場合は、吸着させるように移動する

        // 左端衝突判定
        {
            newRect = newPosition;
            newRect.Width = gap.Width;

            if (newRect.IntersectsWith(rectLeft))
            {
                // 左端に吸着させる
                newPosition.X = 0;
            }
        }
        // 右端衝突判定
        {
            newRect = newPosition;
            newRect.X = newPosition.Right - gap.Width;  // ウィンドウの右隅
            newRect.Width = gap.Width;

            if (newRect.IntersectsWith(rectRight))
            {
                // 右端に吸着させる
                newPosition.X = area.Width - this.Width;
            }
        }
        // 上端衝突判定
        {
            newRect = newPosition;
            newRect.Height = gap.Height;

            if (newRect.IntersectsWith(rectTop))
            {
                // 上端に吸着させる
                newPosition.Y = 0;
            }
        }
        // 下端衝突判定
        {
            newRect = newPosition;
            newRect.Y = newPosition.Bottom - gap.Height; // ウィンドウの下端
            newRect.Height = gap.Height;

            if (newRect.IntersectsWith(rectBottom))
            {
                // 下端に吸着させる
                newPosition.Y = area.Height - this.Height;
            }
        }

        // 実際に移動させる
        this.Left = newPosition.Left;
        this.Top = newPosition.Top;
    }
}

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 11:03 | Comment(3) | TrackBack(0) | C#
この記事へのコメント
ck ベルト [url=http://www.watchsreality.com/]calvin klein jeans 店舗[/url] <a href="http://www.watchsreality.com/" title="calvin klein jeans 店舗">calvin klein jeans 店舗</a>
Posted by calvin klein jeans 店舗 at 2013年09月05日 14:51
通販 時計 [url=http://www.watchsinterate.com/]emporio armani メガネ[/url] <a href="http://www.watchsinterate.com/" title="emporio armani メガネ">emporio armani メガネ</a>
Posted by emporio armani メガネ at 2013年09月05日 14:51
時計 中古 価格 パネライ http://www.watchsround.com/
Posted by 価格 パネライ at 2013年09月05日 14:51
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/43938583

この記事へのトラックバック