Winforms MDI "Desktop" Область Границы - PullRequest
4 голосов
/ 02 марта 2009

Родительский элемент управления MDI по умолчанию имеет большую область «рабочего стола», которая может отображать несколько дочерних форм. Пользователи могут перетаскивать формы на край этой области рабочего стола, чтобы большая часть дочерней формы была за пределами экрана. (Затем в родительском элементе MDI появляется полоса прокрутки). Мне не нравится эта функция. Есть ли способ заблокировать край области рабочего стола, чтобы дочерние формы оставались полностью видимыми?

Ответы [ 3 ]

5 голосов
/ 03 марта 2009

Код, который я использовал для реализации ответа, который я выбрал выше:

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
3 голосов
/ 02 марта 2009
  1. Отключение полос прокрутки окна MDI
  2. Подключите событие OnMove всех дочерних окон. Если окно перемещается за пределы границы, «вставьте» его обратно вдоль x и y, пока оно не вернется внутрь родительского элемента.
3 голосов
/ 02 марта 2009

Чтобы уточнить, что вы говорите, что область рабочего стола клиента MDI - это область клиента.

Вы можете обрабатывать обработчики событий изменения размера / перемещения дочерних форм, а затем изменять размер / ограничивать движение дочернего элемента, когда оно выходит за пределы клиентской области MDI.

...