Lo mejor a mi parcer, es usar RECT, seguramente es mas rapido que crear una region y lo mismo para verificar si el mouse esta dentro de el RECT, asi que bien las apis a utilizar son:
PtInRect (la cual te da si un punto esta dentro de un rectangulo)
luego dentro del timer como no tenes evento "x, y" usas GetCursorPos y ScreenToClient
en cuanto lo que preuntas si hay algun evento que haga esto, pues no, tenes que codificar todo, no hay una forma sensilla, pero bueno el codigo es un poco de logica, te paso un ejemplo bien completo, agrega un timer en un formulario. (Después vos lo adaptas a tu usercontrol y con todos los chiches)
Option Explicit
Private Declare Function PtInRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetRect Lib "user32.dll" (ByRef lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
Private Declare Function ScreenToClient Lib "user32.dll" (ByVal hwnd As Long, ByRef lpPoint As POINTAPI) As Long
Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'solo para el ejemplo
Private Declare Function FillRect Lib "user32.dll" (ByVal hdc As Long, ByRef lpRect As RECT, ByVal hBrush As Long) As Long
Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal crColor As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Dim m_RECT As RECT
Dim m_MouseIn As Boolean
Private Sub Form_Load()
Me.ScaleMode = vbPixels
Me.AutoRedraw = True
SetRect m_RECT, Me.ScaleWidth - 48, 24, Me.ScaleWidth - 24, 48 'Asigno el rectangulo a la derecha de 24x24
PintarRectangulo m_RECT, vbGreen 'lo pinto en un estado normal Verde
Timer1.Enabled = False 'Seteo los datos para el timer
Timer1.Interval = 100
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If PtInRect(m_RECT, X, Y) Then 'si esta dentro del rectangulo
If m_MouseIn = False Then 'una bandera para que no se repita siempre este paso hasta que no salga el mouse (ver en el timer event)
m_MouseIn = True
Timer1.Enabled = True
Debug.Print "Entra en el rectangulo"
If (Button = vbLeftButton) Then 'boton izquierdo
PintarRectangulo m_RECT, vbRed
Else
PintarRectangulo m_RECT, vbBlue 'esto es porque a veces el usuario pincha en el boton luego se arrepiente y despues vuelve sobre el boton. probar esto en cualquier boton.
End If
End If
End If
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (PtInRect(m_RECT, X, Y) = 1) And (Button = vbLeftButton) Then 'dos condiciones dentro del rectangulo y con el boton izquierdo.
If m_MouseIn Then
Debug.Print "MouseDown en el rectangulo"
PintarRectangulo m_RECT, vbRed
End If
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If (PtInRect(m_RECT, X, Y) = 1) And (Button = vbLeftButton) Then
If m_MouseIn Then 'condiciones para decier que esto fue un click
Debug.Print "Click en el rectangulo"
PintarRectangulo m_RECT, vbBlue
End If
End If
End Sub
'Opcional, es en el caso que se hacen muchos click seguidos (no es el caso para un boton cerrar.)
Private Sub Form_DblClick()
Dim PT As POINTAPI
GetCursorPos PT
ScreenToClient Me.hwnd, PT
If (PtInRect(m_RECT, PT.X, PT.Y) = 1) And (GetKeyState(vbLeftButton) < 0) Then
PintarRectangulo m_RECT, vbRed
Debug.Print "MouseDown en el rectangulo 2"
End If
End Sub
'Esto es la parte donde se controla si el mouse sale del rectangulo, el timer se habilita solo cuando el mouse habia entrado en el rectangulo. NO consume muchos recursos
Private Sub Timer1_Timer()
Dim PT As POINTAPI
GetCursorPos PT
ScreenToClient Me.hwnd, PT
If PtInRect(m_RECT, PT.X, PT.Y) = 0 Then 'no estan en el rectangulo entonces..
Timer1.Enabled = False 'detengo el timer
m_MouseIn = False 'cambio la bandera
PintarRectangulo m_RECT, vbGreen 'restablesco el color del boton
Debug.Print "Sale de el rectagulo"
End If
End Sub
Private Sub Form_Resize()
SetRect m_RECT, Me.ScaleWidth - 48, 24, Me.ScaleWidth - 24, 48 'muevo las nuevas cordenadas
PintarRectangulo m_RECT, vbGreen
End Sub
'solo un ejemplo para pintar el rectangulo (si pasa el codigo a un user control cambia el me. por usercontrol.)
Private Sub PintarRectangulo(ByRef tRECT As RECT, oColor As OLE_COLOR)
Dim hBrush As Long
Me.Cls
hBrush = CreateSolidBrush(oColor)
FillRect Me.hdc, tRECT, hBrush
DeleteObject hBrush
Me.Refresh
End Sub
El uso del timer sea un control o por api a mi parecer es lo mejor, ya que se podría evitar, pero también podrían fallar algunos eventos.