Граница области «Рабочий стол» Winforms MDI
Вопрос
Родительский элемент управления MDI по умолчанию имеет большую область «рабочего стола», в которой может отображаться несколько дочерних форм.Пользователи могут перетаскивать формы к краю этой области рабочего стола, чтобы большая часть дочерней формы находилась за пределами экрана.(После этого в родительском элементе MDI появляется полоса прокрутки.) Мне не нравится эта функция.Есть ли способ заблокировать край области рабочего стола, чтобы дочерние формы оставались полностью видимыми?
Решение
- Отключить полосы прокрутки окна MDI
- Перехватите событие OnMove всех дочерних окон.Если окно перемещается за пределы границы, «вытолкните» его обратно по осям x и y, пока оно не окажется внутри родителя.
Другие советы
Код, который я использовал для реализации ответа, выбранного выше:
Public alreadyMoved As Boolean = False
Public Const HEIGHT_OF_MENU_STATUS_BARS As Integer = 50
Public Const WIDTH_OF_MENU_STATUS_BARS As Integer = 141
Private Sub Form_Move(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Move
If Not alreadyMoved Then
alreadyMoved = True
'If I'm over the right boundry, drop back to right against that edge
If Me.Location.X + Me.Width > _
MdiParent.ClientRectangle.Width - WIDTH_OF_MENU_STATUS_BARS Then
MyBase.Location = New System.Drawing.Point( _
(MdiParent.ClientRectangle.Width - Me.Width - _
WIDTH_OF_MENU_STATUS_BARS), MyBase.Location.Y)
End If
'If I'm over the bottom boundry, drop back to right against that edge
If Me.Location.Y + Me.Height > _
MdiParent.ClientRectangle.Height - HEIGHT_OF_MENU_STATUS_BARS Then
MyBase.Location = New System.Drawing.Point( _
MyBase.Location.X, (MdiParent.ClientRectangle.Height - _
Me.Height - HEIGHT_OF_MENU_STATUS_BARS))
End If
'If I'm over the top boundry, drop back to the edge
If Me.Location.Y < 0 Then
MyBase.Location = New System.Drawing.Point(MyBase.Location.X, 0)
End If
'If I'm over the left boundry, drop back to the edge
If Me.Location.X < 0 Then
MyBase.Location = New System.Drawing.Point(0, MyBase.Location.Y)
End If
End If
alreadyMoved = False
End Sub
Чтобы уточнить: то, что вы говорите, является областью «рабочего стола» клиента MDI и является клиентской областью.
Вы можете обрабатывать обработчики событий изменения размера/перемещения дочерних форм, а затем изменять размер/ограничивать перемещение дочернего элемента, когда он выходит за пределы клиентской области MDI.