Элемент управления "метка" также имеет свойство AssociatedControlId, которое связывает маркировку с другим управлением. Пример того, где это полезно, с управлением текстовым полем. После того как они связаны, программы для чтения с экрана больше могут дать лучшие результаты.
Другим примером является переключатель с маркировкой, позволяет Вам нажимать на маркировку, и переключатель выберет, если свойство AssociatedControlId будет установлено.
Вы можете использовать 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
Вот фактический код, который я использовал
Application.Echo False 'turn off screen updates
DoCmd.Maximize
w = Me.WindowWidth
h = Me.WindowHeight
DoCmd.Restore 'restore the window to it's old size
Application.Echo True 'turn on screen updates
DoCmd.MoveSize w / 2 - myWidth / 2, _
h / 2 - myHeigth / 2, _
myWidth, _
myHeigth
Не знаю, какую версию Access вы используете, но в Access 2003, похоже, нет способа напрямую получить эту информацию.
Вот это хак:
DoCmd.Maximize
w = Forms("yourForm").WindowWidth
h = Forms("yourForm").WindowHeight
Это максимизирует текущее окно, предположим, что это ваша форма. Затем вы можете измерить форму, чтобы получить размер области отображения родительского окна, затем отменить развертывание и переместить форму в зависимости от размера родительского окна, который вам теперь известен.
Если есть способ отключить Обновление экрана в Access, вы можете сделать это до развертывания и измерения кода, а затем снова включить его, и это не займет сколько-нибудь заметного времени с точки зрения пользователя.
РЕДАКТИРОВАТЬ: Даже без скрытие команды максимизации от пользователя,
Это может быть интересно: http://www.mvps.org/access/downloads/clFormWindow.bas
Он говорит это:
'' Moves and resizes a window in the coordinate system *
'' of its parent window. *
'' N.B.: This class was developed for use on Access forms *
'' and has not been tested for use with other window *
'' types. *