Microsoft KB Archive/121100

= ACC2: How to Get Form's Right and Down Measurements =

Article ID: 121100

Article Last Modified on 11/6/2000

-

APPLIES TO


 * Microsoft Access 2.0 Standard Edition

-



This article was previously published under Q121100



SUMMARY
Advanced: Requires expert coding, interoperability, and multiuser skills.

This article describes how to create and use an Access Basic Sub procedure called GetFormDimensions to obtain a form window's right and down measurements for use in the MoveSize macro action. This article also demonstrates how to position a form immediately below or to the right of a second form.

This article assumes that you are familiar with Access Basic and with creating Microsoft Access applications using the programming tools provided with Microsoft Access. For more information on Access Basic, please refer to the "Building Applications" manual.



MORE INFORMATION
In Microsoft Access version 2.0, you can use the WindowWidth and WindowHeight form properties to determine the current width and height of the window a form is contained in. However, there are no properties to determine the window's right and down measurements (these measurements are commonly used in the MoveSize macro action to position a form window).

The right and down measurements, along with the width and height, are useful if you want to position a form side-by-side with another form. The following examples demonstrate how to create and use the GetFormDimensions Sub procedure to obtain these measurements and use them to position a form to the right of, and then below, another form using the MoveSize macro action.

NOTE: In the following sample code, an underscore (_) at the end of a line is used as a line-continuation character. Remove the underscore from the end of the line when re-creating this code in Access Basic.

How to Create the Sub Procedure
 Open the sample database NWIND.MDB.  Create a new module and enter the following lines in the module's Declarations section:

     Option Explicit

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

Declare Sub GetWindowRect Lib "User" (ByVal hWnd As Integer, _        lpRect As Rect) Declare Function GetDC Lib "User" (ByVal hWnd As Integer) _ As Integer Declare Function ReleaseDC Lib "User" (ByVal hWnd As Integer, _        ByVal hDC As Integer) As Integer Declare Function GetDeviceCaps Lib "GDI" (ByVal hDC As Integer, _        ByVal nIndex As Integer) As Integer Declare Function GetActiveWindow Lib "User" As Integer Declare Function GetParent Lib "User" (ByVal hWnd As Integer) _ As Integer Declare Function GetClassName Lib "User" (ByVal hWnd As Integer, _        ByVal lpClassName As String, ByVal nMaxCount As Integer) _ As Integer

Global Const TWIPSPERINCH = 1440   Create the following procedures in the module:

Sub GetFormDimensions (F As Form, FRight, FDown, FWidth, FHeight) '*************************************************************     ' PURPOSE: Returns the right, down, width, and height '         measurements of a form window in twips. ' ARGUMENTS: '   F: The form object whose measurements are to be determined. '   FRight, FDown, FWidth, FHeight: Measurement variables '   that will return the dimensions of form F "by reference." ' NOTE: The FWidth and FHeight values will be equivalent to     '    those provided by the form WindowWidth and WindowHeight '   properties. '*************************************************************        Dim FormRect As Rect Dim MDIClient As Rect Dim MDIClientRight, MDIClientDown

' Get the screen coordinates and window size of the form. ' The screen coordinates are returned in pixels measured ' from the upper-left corner of the screen. GetWindowRect F.hWnd, FormRect FRight = FormRect.x1        FDown = FormRect.y1         FWidth = FormRect.x2 - FormRect.x1         FHeight = FormRect.y2 - FormRect.y1

' Convert the measurements from pixels to twips. ConvertPIXELSToTWIPS FRight, FDown ConvertPIXELSToTWIPS FWidth, FHeight

' If the form is not a pop-up form, adjust the screen ' coordinates to measure from the top of the Microsoft ' Access MDIClient window. Position 0,0 for a pop-up form ' is the upper left corner of the screen, whereas position ' 0,0 for a normal window is the upper left corner of the ' Microsoft Access client window below the menu bar. If GetWindowClass(F.hWnd) <> "OFormPopup" Then ' Get the screen coordinates and window size of the ' MDIClient window. GetWindowRect GetParent(F.hWnd), MDIClient MDIClientRight = MDIClient.x1           MDIClientDown = MDIClient.y1            ConvertPIXELSToTWIPS MDIClientRight, MDIClientDown

' Adjust the form dimensions from the MDIClient ' measurements. FRight = FRight - MDIClientRight FDown = FDown - MDIClientDown End If     End Sub

Sub ConvertPIXELSToTWIPS (X, Y)     '************************************************************* ' PURPOSE: Converts the two pixel measurements passed as     '          arguments to twips. ' ARGUMENTS: '   X, Y: Measurement variables in pixels. These will be     '          converted to twips and returned through the same '         variables "by reference." '*************************************************************        Dim hDC As Integer, hWnd As Integer, RetVal As Integer Dim XPIXELSPERINCH, YPIXELSPERINCH Const LOGPIXELSX = 88 Const LOGPIXELSY = 90

' Retrieve the current number of pixels per inch, which is        ' resolution-dependent. hDC = GetDC(0) XPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSX) YPIXELSPERINCH = GetDeviceCaps(hDC, LOGPIXELSY) RetVal = ReleaseDC(0, hDC)

' Compute and return the measurements in twips. X = (X / XPIXELSPERINCH) * TWIPSPERINCH Y = (Y / YPIXELSPERINCH) * TWIPSPERINCH End Sub

Function GetWindowClass (hWnd) As String '*************************************************************     ' PURPOSE: Retrieve the class of the passed window handle. ' ARGUMENTS: '   hWnd: The window handle whose class is to be retrieved. ' RETURN: '   The window class name. '*************************************************************        Dim Buff As String Dim BuffSize As Integer Buff = String$(255, " ") BuffSize = GetClassName(hWnd, Buff, 255) GetWindowClass = Left$(Buff, BuffSize) End Function 

How to Use the GetFormDimensions Sub Procedure
 Open the sample database NWIND.MDB.  Add the following Sub procedure to the module that you created in step 2 above:

Sub MoveEmployeesAround Dim frmCust As Form, frmEmp As Form Dim CustRight, CustDown, CustWidth, CustHeight Dim EmpRight, EmpDown, EmpWidth, EmpHeight

Set frmCust = Forms!Customers Set frmEmp = Forms!Employees

GetFormDimensions frmCust, CustRight, CustDown, _ CustWidth, CustHeight GetFormDimensions frmEmp, EmpRight, EmpDown, _ EmpWidth, EmpHeight

frmEmp.SetFocus

MsgBox "Move Employees to the right of Customers!" DoCmd MoveSize CustRight + CustWidth, CustDown

MsgBox "Move Employees below Customers!" DoCmd MoveSize CustRight, CustDown + CustHeight End Sub </li> Open the Customers and Employees forms in Form view.</li> Select the module, and then choose Immediate Window from the View menu.</li> Type the following line in the Immediate window, and then press ENTER:

MoveEmployeesAround </li> In the message box that appears, choose OK. The Employees form will be positioned immediately to the right of the Customers form, and then another message box will appear.</li> In the second message box, choose OK. The Employees form will be positioned immediately below the Customers form.</li></ol>

NOTE: Depending on the position and size of the Customers form, the Employees form may be positioned so that you cannot see it.

<div class="references_section">