Вопрос

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

Это было полезно?

Решение

  1. Отключить полосы прокрутки окна MDI
  2. Перехватите событие 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top