我试图强制MS-Access表单相对于主窗口的右边缘采取某个位置(实际上我想将它居中,但我可以看到也希望将它停靠在一侧或另一侧).我可以重新定位这个表格Me.Move,例如,
Me.Move newWindowLeft, newWindowTop, newWidth, newHeight
Run Code Online (Sandbox Code Playgroud)
但是,如何找出父窗口的宽度?
您可以使用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)
不确定您使用的是哪个版本的 Access,但在 Access 2003 中,似乎没有直接获取此信息的方法。
这是一个技巧:
DoCmd.Maximize
w = Forms("yourForm").WindowWidth
h = Forms("yourForm").WindowHeight
Run Code Online (Sandbox Code Playgroud)
这将最大化当前窗口,我们假设这是您的窗体。然后,您可以测量窗体以获取父窗口显示区域的大小,然后取消最大化,并根据您现在知道的父窗口的大小移动窗体。
如果有办法在 Access 中关闭 ScreenUpdating,您可以在最大化和测量代码之前执行此操作,然后将其重新打开,并且就用户而言,不会花费任何明显的时间。
编辑: 即使没有向用户隐藏最大化命令,整个最大化和移动操作发生的速度也比用户看到的要快。
这是一个丑陋的黑客,但它确实有效。