如何在MS-Access中找到父窗口的宽度

BIB*_*IBD 5 ms-access vba

我试图强制MS-Access表单相对于主窗口的右边缘采取某个位置(实际上我想将它居中,但我可以看到也希望将它停靠在一侧或另一侧).我可以重新定位这个表格Me.Move,例如,

    Me.Move newWindowLeft, newWindowTop, newWidth, newHeight
Run Code Online (Sandbox Code Playgroud)

但是,如何找出父窗口的宽度?

DJ.*_*DJ. 7

您可以使用Windows API:

(更新返回缇)

Type Rect
    x1 As Long
    y1 As Long
    x2 As Long
    y2 As Long
End Type

Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As Rect) As Long

Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long

Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Const LOGPIXELSX = 88
Const LOGPIXELSY = 90
Const DIRECTION_VERTICAL = 1
Const DIRECTION_HORIZONTAL = 0

Public Function GetMainWindowSize()

    Dim MDIRect As Rect
    Dim lWidthPixels As Long
    Dim lWidthTwips As Long

    ' Get the screen coordinates and window size of the MDIClient area'
    GetClientRect Application.hWndAccessApp, MDIRect

    lWidthPixels = MDIRect.x2 - MDIRect.x1
    lWidthTwips = PixelsToTwips(lWidthPixels, DIRECTION_HORIZONTAL)

    MsgBox "Width (Pixels) = " & lWidthPixels & "  Width (Twips) = " & lWidthTwips

End Function


Function PixelsToTwips(lPixels As Long, lDirection As Long) As Long

    Dim lDeviceHandle As Long
    Dim lPixelsPerInch As Long

    lDeviceHandle = GetDC(0)

    If lDirection = DIRECTION_HORIZONTAL Then
        lPixelsPerInch = GetDeviceCaps(lDeviceHandle, LOGPIXELSX)
    Else

        lPixelsPerInch = GetDeviceCaps(lDeviceHandle, LOGPIXELSY)
    End If

    lDeviceHandle = ReleaseDC(0, lDeviceHandle)

    PixelsToTwips = lPixels * 1440 / lPixelsPerInch

End Function
Run Code Online (Sandbox Code Playgroud)


Ste*_*bob 4

不确定您使用的是哪个版本的 Access,但在 Access 2003 中,似乎没有直接获取此信息的方法。

这是一个技巧:

DoCmd.Maximize

w = Forms("yourForm").WindowWidth
h = Forms("yourForm").WindowHeight
Run Code Online (Sandbox Code Playgroud)

这将最大化当前窗口,我们假设这是您的窗体。然后,您可以测量窗体以获取父窗口显示区域的大小,然后取消最大化,并根据您现在知道的父窗口的大小移动窗体。

如果有办法在 Access 中关闭 ScreenUpdating,您可以在最大化和测量代码之前执行此操作,然后将其重新打开,并且就用户而言,不会花费任何明显的时间。

编辑: 即使没有向用户隐藏最大化命令,整个最大化和移动操作发生的速度也比用户看到的要快。

这是一个丑陋的黑客,但它确实有效。