關於限制子窗體在父容器中移動邊界的總結(很簡單的東西,寫給新人)
阿新 • • 發佈:2019-01-29
有時候,我們直接用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; } } }//滑鼠按下狀態 }//滑鼠左鍵