The next example shows how to add Tooltips to your forms using the new Mouse events. First, an overview of the new mouse events in Microsoft Access 2.0.
The following mouse-related events were added to Microsoft Access 2.0. They are based on the same events in Microsoft Visual Basic.
Click |
Fires when user clicks the left mouse button. |
DblClick |
Fires when the user double-clicks the left mouse button |
MouseDown |
Fires when the user first clicks any mouse button |
MouseUp |
Fires when the user releases any mouse button |
MouseMove |
Fires when the mouse cursor is moved on the screen |
One of the keys to working with the mouse events is understanding the coordinate system they use. The following describes some key points about this system:
So when you move the mouse inside a control, the mouse coordinates are relative to the control. To convert these to section coordinates, you need to add the control's Top and Left properties.
SectionX = ControlX + Forms!MyForm!MyCntl.Left SectionY = ControlY + Forms!MyForm!MyCntl.Top
To convert the section coordinates to form coordinates, you need to correct for any possible scroll of the section within the form. You do this with the CurrentSectionLeft and CurrentSectionTop properties.
FormX = SectionX + Forms!MyForm.CurrentSectionLeft FormY = SectionY + Forms!MyForm.CurrentSectionTop
Finally, to convert form coordinates to screen coordinates, you need to compensate for the form caption and borders. This information is available from Microsoft Windows® APIs. (Note: You also need to convert from twips to pixels at this step.)
GetWindowRect Forms!MyForm.hWnd, rcWnd TwipsPerPixelX = 1440 / GetDeviceCaps(hdc, LOGPIXELSX) TwipsPerPixelY = 1440 / GetDeviceCaps(hdc, LOGPIXELSY) ScreenX = FormX / TwipsPerPixelX + GetSystemMetrics(CM_SXFRAME) + rcWnd.Left ScreenY = FormY / TwipsPerPixelY + (GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME)) + rcWnd.Top
Now we're ready to look at the Tooltips sample in the AC301 database. This sample uses the Customer form and the Tooltips global module. Open the Customer form and point at a label for one of the text box controls with the mouse. After a few moments, a Tooltip book will appear, similar to the one you see on the toolbars in all Microsoft Office family programs.
The code to implement this is mostly in the Tooltips global module. It's invoked from event procedures in the Customer form module. The events used at the form level are:
Other events used are:
The two key events in this sample are the control level mouse move and the timer events. The following functions in the Tooltips global module implement this functionality:
Sub TTProcessControlMove (x As Single, y As Single, Cntl As Control) Dim i As Integer Dim Label As Control Dim ptMouse As POINTAPI 'First map to Tips array using the Tag property in Cntl 'as the index. Get a pointer to the label for the control i = Cntl.Tag Set Label = Forms(th.TipForm)(TipList(i).Label) 'Set up mouse point in section coords ptMouse.x = x + Cntl.Left ptMouse.y = y + Cntl.Top 'See if the mouse is over the label If (Not TTInLabel(Label, ptMouse)) Then 'Not over the label. We only show tips when pointing to 'a label. Dismiss the tip if showing and kill timer TTDismissTip Else 'See if showing the tip already If (th.TipShowing) Then 'if we are but have changed labels since this tip 'went up then dismiss it If (i <> th.CurrTip) Then TTDismissTip Else 'Not showing the tip. Start timer if we need to If (Forms(th.TipForm).TimerInterval = 0) Then Forms(th.TipForm).TimerInterval = th.DelayTime End If 'Record current mouse position and index of label th.CurrPos = ptMouse th.CurrTip = i End If End If End Sub Sub TTProcessTimer () Dim CursorPos As POINTAPI Dim pt As POINTAPI Dim TipCtl As Control Dim x As Integer 'Get the current cursor position and map our saved position from the last mouse move message to screen coords GetCursorPos CursorPos TTSectionToScreen th.CurrPos, pt 'If the 2 points are the same, then user has waited long enough. 'Time to show the tip If (CursorPos.x = pt.x) Then If (CursorPos.y = pt.y) Then 'Point to the ToolTip control Set TipCtl = Forms(th.TipForm)(th.Tip) 'First set the text and width of the tip control TipCtl.Value = TipList(th.CurrTip).TipText TipCtl.Width = TipList(th.CurrTip).TipWidth 'Now set it in position x = th.CurrPos.x - TipCtl.Width / 2 If (x < 0) Then x = 0 TipCtl.Left = x TipCtl.Top = th.CurrPos.y + GetSystemMetrics(SM_CYCURSOR) * th.TwipsPerPixelY * 2 / 3 'Finally set the flag and show the control th.TipShowing = True TipCtl.Visible = True End If End If End Sub
Please see the sample database for more information on this example.