访问窗口重新调整大小

时间:2016-01-07 11:22:54

标签: ms-access access-vba

我最近购买了一台34英寸宽屏显示器。我正在使用戴尔显示管理器设置不同的窗口,使我能够整齐地打开多个word文档等。

当我使用Access时,我可以将应用程序窗口正确停靠在屏幕的1/2或1/3处。但是,当我打开一个表单时(因为它可能是一个孩子?),它不会停留在父窗口或戴尔显示管理器的范围内。

所以,我的想法是将任何弹出窗体的大小调整为父访问窗口的尺寸,具有相同的左,顶部,宽度和高度。

然而,尽管尝试了一些不同的技术,但我还是无法实现这一目标。

有人有任何想法吗?

谢谢!

编辑:谢谢Jashin。我已经实现了您的代码,但表单仍然没有像我预期的那样出现。这是我用过的代码:

SetWindowPos hWndChild, hWndParent, mainRECT.wdw_left, mainRECT.wdw_top, mainRECT.wdw_right, mainRECT.wdw_bottom, &H4

当表单加载高度时左侧略微偏离,但表单非常薄。我尝试从mainRECT.wdw_right获取宽度 - mainRECT.wdw_left,但结果相同。

最终编辑:通过对@Jashin提供的代码进行一些调整。这是最终的代码:

Dim hWndParent As LongPtr  
Dim hWndChild As LongPtr   
Dim mainRECT As RECT      

hWndParent = Application.hWndAccessApp

hWndChild = Me.hwnd

GetWindowRect hWndParent, mainRECT 

SetParent hWndChild, hWndParent   

SetWindowPos hWndChild, 0, mainRECT.wdw_left, mainRECT.wdw_top, mainRECT.wdw_right - mainRECT.wdw_left, mainRECT.wdw_bottom, &H4

Me.SetFocus

DoCmd.MoveSize 0, 0`

2 个答案:

答案 0 :(得分:2)

我不熟悉戴尔显示器管理器,但是,如果我理解您的问题,您正在寻找一些程序来强制在屏幕上的任何位置放置弹出窗体。正如@ThunderFrame建议您无法使用Access API执行此操作,但您可以使用Windows API执行此操作。

创建一个模块并声明以下函数

Public Type RECT
    wdw_left As Long
    wdw_top As Long
    wdw_right As Long
    wdw_bottom As Long
End Type

Public Declare PtrSafe Function SetParent Lib "user32" _
                               (ByVal hWndChild As LongPtr, _
                                ByVal hWndParent As LongPtr) As Long

Public Declare PtrSafe Function SetWindowPos Lib "user32" _
                               (ByVal hwnd As LongPtr, _
                                ByVal hWndInsertAfter As LongPtr, _
                                ByVal x As Long, _
                                ByVal y As Long, _
                                ByVal cx As Long, _
                                ByVal cy As Long, _
                                ByVal wFlags As Long) As Long

Public Declare PtrSafe Function GetWindowRect Lib "user32" _
                               (ByVal hwnd As LongPtr, _
                                lpRect As RECT) As Long

注意我正在使用 PtrSafe LongPtr 关键字,因为我正在使用64位系统;如果您使用的是32位系统,则可以删除PtrSafe关键字并将Long替换为LongPtr。

然后在弹出窗体的Form_Open()事件中编写以下代码。

Dim hWndParent As LongPtr  ' handle of your parent form (access window or
                           ' any other form you want to set as parent
Dim hWndChild As LongPtr   ' handle of the child pop-up form
Dim mainRECT As RECT       ' coordinates of the parent form

hWndParent = Form_frm_home.hwnd ' or hWndAccessApp to get the handle of
                                ' the main Access Window
hWndChild = Form_frm_child.hwnd

GetWindowRect hWndParent, mainRECT ' this gets the coordinates of the 
                                   ' parent window

SetParent hWndChild, hWndParent   ' set the pop-up form as child of the 
                                  ' parent form

SetWindowPos hWndChild, hWndParent, left, top, width, heigth, &H4

SetWindowPos功能允许您在屏幕上的任何位置放置弹出窗体。您可以使用以下代码从RECT结构访问父表单的坐标

mainRECT.wdw_left
mainRECT.wdw_top
mainRECT.wdw_right
mainRECT.wdw_bottom

SetParent函数允许您创建子表单,因此它将始终位于父表单的边界之间,并将随主表单(或访问窗口)一起移动。

希望这有帮助!

答案 1 :(得分:0)

您无法使用Access API直接执行此操作,但您可以使用某些Windows API函数来实现您之后的结果。 您需要执行以下操作

  1. 获取Access Application窗口的RECT结构(使用隐藏的Hwnd属性)和Windows API GetWindowRect函数
  2. 构建一个新的RECT结构,您希望相对于应用程序的RECT放置您的表单,然后使用SetWindowPos Windows API函数