1. 程式人生 > >關於限制子窗體在父容器中移動邊界的總結(很簡單的東西,寫給新人)

關於限制子窗體在父容器中移動邊界的總結(很簡單的東西,寫給新人)

有時候,我們直接用MDI父窗體+MDI窗體可以方便的構建多文件應用,但在有些時候,我們不選擇使用MDI窗體形式,

可能是出於某些限制,比如,你需要在父窗體中使用控制元件,但老是把新建的子窗體給遮住,你選擇使用panel物件來裝一個視窗,可是因為窗體如果

是有邊框的,就會讓輸入焦點定位不準確,滑鼠事件不能正確響應等等,你選擇了自定義窗體來做子窗體,這個時候,你可能就會考慮到限制子窗體在父

容器中如何限制其移動的範圍,如果不限制,當窗體移動到被其他控制元件遮住的地方,就永遠回不來了,所以這裡,我總結一個限制.

原理思路:移動窗體就是控制窗體的top和left屬性,那麼控制的時候,可以用下面的邏輯:

1.top和left分開寫實現移動的程式碼

2.首先判斷滑鼠拖動的方向

3.在方向裡面限制這個方向拖動的對應的極限邊緣時哪裡(值是多少?)

4.反過來判斷另外一邊

下面附上這段程式碼[放在對應窗體的mouseMove事件中],startX和startY是滑鼠按下的時候,記錄的位置

 if (e.Button == MouseButtons.Left)
            {
                if (mouseDowning == true)
                {
                    if (e.X > startX) //滑鼠向右拖動
                    {
                        if (this.Left < this.Parent.Width - 40)
                        {
                            this.Left += e.X - startX;
                        }
                        else {
                            this.Left = this.Parent.Width - 40;
                        }

                    }
                    else  //滑鼠向左拖行
                    {
                        if (this.Left >= 2)
                        {
                            this.Left += e.X - startX;
                        }
                        else {
                            this.Left = 1;
                        }
 
                    }

                    if (e.Y > startY)//滑鼠向下拖行
                    {
                        if (this.Top < this.Parent.Height - 40)
                        {
                            this.Top += (e.Y - startY);
                        }
                        else
                        {
                            this.Top = this.Parent.Height - 40; 
                        }

                    }
                    else//滑鼠時想上拖行的
                    {
                        if (this.Top > 2)
                        {
                            this.Top += (e.Y - startY);
                        }
                        else
                        {
                            this.Top = 1;
                        }
                    }


                }//滑鼠按下狀態
            }//滑鼠左鍵