VB6 不要在 Auto-Activate Child 上形成 Form-Resize Windows 10
VB6 Don't Auto-Activate Child Form on Form-Resize Windows 10
我支持的这个 VB6 遗留系统中的一个 window 将 Word 2007 实例托管为 child window. On Windows 7, the parent window can be resized without any issues: the window doesn't update until the mouse is released after resizing。然而,在 Windows 10 上,window 在调整大小时会动态更新。
我在 Windows 10 中遇到的问题是 child Word window 在第一次更新时变得 activated/focused:您只能拖动以调整大小parent window 一次几个像素,然后 child window 获得焦点并且 parent window 上的调整大小事件是已取消(光标仍在调整大小图标上,但继续拖动无效)。最大化、最小化和恢复 parent window 都正常工作。一旦 child Word window 关闭(通过 Word 中的文件菜单), parent window 可以正常调整大小,因为没有 child window 到 activate/focus。同样的 automatic-child-window-activation-after-parent-window-resizing 出现在 Windows 7 中,但是因为调整大小事件直到 parent window 实际更新后才会触发,所以这不是问题。
我的难题是我在代码中没有看到任何提示为什么 child window 会自动获取 activated/focused,除非那只是默认值 Windows行为。无论哪种情况,我都非常确定我需要一种方法来避免这种情况发生。
这段代码 明确地 所做的(主要是 ResizeControls() 子;其余主要用于上下文)是 resizing/positioning Word window 来对应 parent window 中容器的新大小,这与 Windows 中的行为一致 7.
据我所知,我不相信 GetWindow() 实际上激活 window 它得到的句柄,但如果确实如此,那么这可能就是问题的原因,在这种情况下,我需要能够在不激活它的情况下获得 window 的句柄。
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
原来我是瞎子and/or没有仔细阅读文档所有代码中使用的Windows函数。第二天找到了解决方案,忘了回来回答这个问题,但正如 @wqw's , the issue was with SetWindowPos(). The SWP_NOACTIVATE flag 所确认的那样,需要将其传递给 SetWindowPos() 以防止激活目标 window (在我的例子中,子词 window).
我支持的这个 VB6 遗留系统中的一个 window 将 Word 2007 实例托管为 child window. On Windows 7, the parent window can be resized without any issues: the window doesn't update until the mouse is released after resizing。然而,在 Windows 10 上,window 在调整大小时会动态更新。
我在 Windows 10 中遇到的问题是 child Word window 在第一次更新时变得 activated/focused:您只能拖动以调整大小parent window 一次几个像素,然后 child window 获得焦点并且 parent window 上的调整大小事件是已取消(光标仍在调整大小图标上,但继续拖动无效)。最大化、最小化和恢复 parent window 都正常工作。一旦 child Word window 关闭(通过 Word 中的文件菜单), parent window 可以正常调整大小,因为没有 child window 到 activate/focus。同样的 automatic-child-window-activation-after-parent-window-resizing 出现在 Windows 7 中,但是因为调整大小事件直到 parent window 实际更新后才会触发,所以这不是问题。
我的难题是我在代码中没有看到任何提示为什么 child window 会自动获取 activated/focused,除非那只是默认值 Windows行为。无论哪种情况,我都非常确定我需要一种方法来避免这种情况发生。
这段代码 明确地 所做的(主要是 ResizeControls() 子;其余主要用于上下文)是 resizing/positioning Word window 来对应 parent window 中容器的新大小,这与 Windows 中的行为一致 7.
据我所知,我不相信 GetWindow() 实际上激活 window 它得到的句柄,但如果确实如此,那么这可能就是问题的原因,在这种情况下,我需要能够在不激活它的情况下获得 window 的句柄。
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
原来我是瞎子and/or没有仔细阅读文档所有代码中使用的Windows函数。第二天找到了解决方案,忘了回来回答这个问题,但正如 @wqw's