Ciao, certo chiedere di inserire l'evento sarebbe la cosa più pulita da fare, anche perchè ovviamente un timer è un controllo "dispendioso" (almeno in Windows)
In attesa però ho implementato e modificato il codice di vuott e ho ottenuto il risultato che volevo, sia per il menù (che appare premendo il menù button), sia per l'eventuale sotto menù.
Gianluigi , perchè dici che i menù button non stanno sempre nella stessa posizione?
In ogni caso io non considerato nessuna coordinata fissa. Ogni controllo (tranne i menù) ha la proprietà ScreenX e ScreenY, dunque sappiamo sempre dove sono e il menù parte sempre dalla X del bottone e dalla sua Y + la sua H. Stessa cosa i sotto menù che hanno una X che parte dalla X del bottone + la len della parola più lunga, e una Y che si riferisce al menù selezionato. Non è preciso al millimetro ma per adesso che sono all'inizio dell'applicazione pò bastare.
Qui il codice, magari viene fuori un idea per ottimizzarlo
Public Sub tmrMouse_Timer()
Dim c As Menu
Dim cc As Menu
Dim rects As New Rect[]
Dim rt As Rect
Dim idxs As New Integer[]
Dim idxs2 As New Integer[]
Dim idx As Integer = 0
Dim iRt As Integer
Dim longStr As String
If Not IsNull(selMenu)
If Not selMenu.Closed Then
For Each c In selMenu.Children
rt = New Rect(scrnX, (scrnY + (25 * rects.Count)), rectW, rectH)
rects.Add(rt)
idxs.Add(rects.Count)
idxs2.Add(0)
Next
For Each c In selMenu.Children
If c.Children.Count > 0 Then
If Not c.Closed Then
'prima cercare la stringa piç lunga
For iRt = 0 To (c.Children.count - 1)
If Len(c.Children[iRt].Caption) > Len(longStr) Then
longStr = c.Children[iRt].Caption
Endif
Next
rectW = Me.Font.TextWidth(longStr) + 50
For iRt = 0 To (c.Children.count - 1)
rt = New Rect((scrnX + rectW), (rects[idx].Y + (25 * iRt)), rectW, rectH)
rects.Add(rt)
idxs.Add(idx)
idxs2.Add(iRt)
Next
Endif
Endif
idx = idx + 1
Next
lblMessage.Text = Null
For iRt = 0 To (rects.count - 1)
If rects[iRt].Contains(Mouse.ScreenX, Mouse.ScreenY) Then
If iRt < selMenu.Children.Count Then
lblMessage.text = selMenu.Children[iRt].Tag
Else
lblMessage.text = selMenu.Children[idxs[iRt]].Children[idxs2[iRt]].Tag
Endif
Break
Endif
Next
Endif
Endif
End
Public Sub btnMenu_Enter()
Dim c As Menu
Dim cc As Menu
Dim longStr As String
scrnX = Last.ScreenX + 10
scrnY = (Last.ScreenY + Last.Height + 10)
For Each c In Me.Menus
If c.name = Last.Menu Then
selMenu = c
If c.Children.Count > 0 Then
For Each cc In c.Children
If Len(cc.Caption) > Len(longStr) Then
longStr = cc.Caption
Endif
Next
Endif
Endif
Next
rectH = Last.Font.TextHeight(longStr)
rectW = Last.Font.TextWidth(longStr) + 30
End