VB6 Не активировать дочернюю форму при изменении размера формы Windows 10 - PullRequest
3 голосов
/ 26 марта 2020

Окно в этой устаревшей системе VB6, которую я поддерживаю, содержит экземпляр Word 2007 как дочернее окно . В Windows 7 размер родительского окна можно изменить без каких-либо проблем: окно не обновляется до тех пор, пока не будет отпущена мышь после изменения размера . Однако в Windows 10 окно обновляется динамически при изменении его размера.

Проблема, с которой я сталкиваюсь в Windows 10, заключается в том, что дочернее окно Word активируется / фокусируется на первом обновлении: вы можно только перетащить, чтобы изменить размер родительского окна на пару пикселей за раз, прежде чем дочернее окно будет сфокусировано и событие изменения размера родительского окна будет отменено (курсор все еще находится на значке изменения размера, но продолжение перетаскивания не оказывает никакого влияния). Максимизация, минимизация и восстановление родительского окна - все работает нормально. Как только дочернее окно Word закрыто (через меню файлов в Word), родительское окно можно изменить в обычном размере, потому что нет дочернего окна для активации / фокусировки. Тот же автомат c -child-window-активации-after-parent-window-resizing происходит в Windows 7, но поскольку событие resize не срабатывает до тех пор, пока родительское окно фактически не обновлено, это не проблема .

Моя загадка состоит в том, что я не вижу в коде ничего, что подсказывало бы, почему дочернее окно автоматически активируется / фокусируется, если только это не поведение по умолчанию Windows. В любом случае, я почти уверен, что мне нужен способ, чтобы этого не произошло.

Все, что этот код явно делает (в первую очередь подпрограмма ResizeControls (), остальное здесь главным образом для контекста) - изменение размера / позиционирование окна Word в соответствии с новым размером контейнера в родительском окне, что соответствует поведению в Windows 7.

Из того, что я могу сказать, я не верьте , что GetWindow () на самом деле активирует окно, к которому обращается дескриптор, но если это так, то это, вероятно, причина проблемы, и в этом случае мне нужно иметь возможность получить дескриптор окна без его активации.

PDFView.frm :

Begin VB.Form frmPDFView
    Caption         =   "Untitled"
    ClientHeight    =   8655
    ClientLeft      =   1320
    ClientTop       =   1665
    ClientWidth     =   9270
    ' ...

    Begin VB.PictureBox picContainer 
        BackColor       =   &H00FFFFFF&
        Height          =   4215
        Left            =   1080
        ScaleHeight     =   4155
        ScaleWidth      =   4995
        TabIndex        =   0
        Top             =   120
        Width           =   5055
    End
End

Private Sub ResizeControls()
On Error Resume Next

    Dim pWndChild As Long
    Dim r As RECT
    Dim rtn As Long

    picContainer.Left = 100
    picContainer.Height = Me.Height - 1300
    picContainer.Width = Me.Width - 350
    picContainer.Top = 300

    pWndChild = GetWindow(picContainer.hWnd, GW_CHILD)
    rtn = GetLastError

    If (pWndChild) Then
        rtn = GetClientRect(picContainer.hWnd, r)
        rtn = SetWindowPos(pWndChild, 0, 0, 0, r.Right - r.Left, r.Bottom - r.Top, SWP_NOZORDER Or SWP_NOMOVE)
    Else
        rtn = GetLastError
    End If

End Sub

Private Sub Form_Resize()
On Error GoTo ERROR_HANDLER

    Call ResizeControls

    Exit Sub

ERROR_HANDLER:
    Err.Clear
    Resume Next

End Sub

1 Ответ

1 голос
/ 30 марта 2020

Оказывается, я слепой и / или недостаточно прочел документацию для всех Windows функций, используемых в коде. Нашел решение на следующий день и забыл вернуться и ответить на него, но, как подтверждает @ wqw комментарий , проблема была в SetWindowPos (). Флаг SWP_NOACTIVATE необходимо было передать в SetWindowPos (), чтобы предотвратить активацию целевого окна (в моем случае, дочернего окна Word).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...