【问题标题】:VB6 Don't Auto-Activate Child Form on Form-Resize Windows 10VB6 不要在窗体调整大小 Windows 10 上自动激活子窗体
【发布时间】:2020-07-07 12:48:37
【问题描述】:

我支持的这个 VB6 旧系统中的一个窗口将 Word 2007 实例作为child window 托管。在 Windows 7 上,可以毫无问题地调整父窗口的大小:窗口不会更新 until the mouse is released after resizing。但是,在 Windows 10 上,窗口会在调整大小时动态更新。

我在 Windows 10 中遇到的问题是子 Word 窗口被激活/专注于第一次更新:在子窗口获取之前,您一次只能拖动几个像素来调整父窗口的大小聚焦并取消父窗口上的resize事件(光标仍在resize图标上,但继续拖动没有效果)。最大化、最小化和恢复父窗口都正常工作。一旦子 Word 窗口关闭(通过 Word 中的文件菜单),父窗口可以正常调整大小,因为没有子窗口可以激活/聚焦。在 Windows 7 中发生了相同的自动子窗口激活后父窗口调整大小,但由于调整大小事件直到父窗口实际更新后才会触发,所以这不是问题。

我的难题是,我在代码中看不到任何提示子窗口自动激活/聚焦的原因,除非这只是默认的 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

【问题讨论】:

  • 对于SetWindowPos,还有一个Const SWP_NOACTIVATE As Long = &H10 标志。如果没有设置pWndChild被激活。

标签: windows-7 vb6 windows-10


【解决方案1】:

原来我是盲人和/或没有充分阅读文档以了解代码中使用的所有 Windows 函数。第二天找到了解决方案,忘了回来回答这个问题,但正如@wqwcomment 所证实的,问题出在SetWindowPos() 上。 SWP_NOACTIVATE flag 需要传递给 SetWindowPos() 以防止激活目标窗口(在我的例子中,子 Word 窗口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2013-04-30
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多