Граница области рабочего стола Winforms MDI

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


person Jeff    schedule 02.03.2009    source источник


Ответы (3)


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

Чтобы уточнить, то, что вы называете «рабочий стол» клиента MDI, - это клиентская область.

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

person casperOne    schedule 02.03.2009