Differenze tra le versioni di "Far apparire un Balloon, quando si passa con il mouse su un menu"

Da Gambas-it.org - Wikipedia.
 
(8 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Il caso in questione è quello in cui si vuole far apparire un ''Balloon'' su un ''Menu'', quando, passandoci sopra, venga rilevato che non sono stati creati ancora dei sub-menu (nel nostro esempio almeno uno, che chiameremo: ''Menu2'').
+
Il caso in questione è quello in cui si vuole far apparire un ''Balloon'' sulla voce principale di un ''Menu'', passandoci sopra con il puntatore del mouse.
Provvederemo a porre una ''Label'' (purché questa non dia fastidio ad eventuali altri oggetti prossimi al ''Menu'') proprio in modo contiguo al ''Menu''. La ''Label'' potrà anche essere posta totalmente al di sopra del ''Menu'': la ''Label'' non riuscirà a coprire l'azione del ''Menu'', il quale resterà comunque perfettamente funzionante.
 
Verrà, quindi, così sollevato l'evento ''_Enter'', quando il mouse entrerà nella ''Label'':
 
  
  '''Public''' Sub Label1_Enter()
+
===Usando la Proprietà ".Tracking" del ''Form''===
 +
La Proprietà ".Tracking" imposta se il Controllo (nel nostro caso il ''Form'') riceverà eventi "_MouseMove()" <SPAN Style="text-decoration:underline">senza il bisogno di tenere premuto un tasto del mouse</span>, mentre ci si sposta con esso.
 +
 
 +
Mostriamo un esempio pratico, nel quale si è creato un ''Menu'' sul ''Form'':
 +
  '''Public''' Sub Form_Open()
 +
 +
  Me.Tracking = True
 +
 +
'''End'''
 
   
 
   
  <FONT color=#006400>' ''Qui un comando qualsiasi... ad esempio:''</font>
+
  '''Public''' Sub Form_MouseMove()
   If IsNull(Me.Controls["Menu2"]) Then
+
    Balloon.Warning("Attenzione ! Sotto-Menu assenti", Label1)
+
   Select Case Mouse.X
  Endif
+
  Case 15 To 50
 +
    If Mouse.Y < 20 Then  
 +
      Balloon.Info("Il mouse sta passando sul Menu !", Me, Mouse.X, Mouse.Y)
 +
    Else
 +
      Balloon.Hide
 +
    Endif  
 +
End Select
 
   
 
   
 
  '''End'''
 
  '''End'''
  
 +
===Usando un Oggetto ''Timer''===
 +
Si potrà utilizzare un ''Timer'' e la Classe ''Rect'', per verificare la distanza del puntatore del mouse dall'angolo alto a sinistra dello schermo in rapporto con la distanza del ''Form'', ove sono presenti le voci principali del Menu, dall'angolo alto a sinistra dello schermo.
  
 +
Mostriamo un esempio pratico:
 +
Private tm As Timer
 +
 +
 +
'''Public''' Sub Form_Open()
 +
 
 +
  With tm = New Timer As "Tempus"
 +
    .Delay = 50
 +
    .Start
 +
  End With
 +
 
 +
'''End'''
 +
 +
'''Public''' Sub Tempus_Timer()
 +
 
 +
  Dim rt As New Rect(Me.ScreenX + 10, Me.ScreenY + 10, Me.Font.TextWidth(Menu1.Caption), Me.Font.TextHeight(Menu1.Caption))
 +
 
 +
  If rt.Contains(Mouse.ScreenX, Mouse.ScreenY) Then
 +
    Balloon.Info("Un testo qualsiasi.", Me, 10 + (Me.Font.TextWidth(Menu1.Caption) / 2), 5)
 +
  Endif
 +
 
 +
'''End'''
  
Un'alternativa può essere quella di verificare il passaggio del mouse nell'area del ''Menu'', tenendo conto delle coordinate .X ed .Y assunte dal puntatore del mouse ad ogni suo spostamento. In questo caso, però, la verifica potrà avvenire solo se il mouse viene spostato tenendo premuto un suo tasto.
+
===Usando un ciclo infinito===
 
+
Al posto del ''Timer'' si potrà usare un Ciclo infinito e - come sopra - la Classe ''Rect'':
Esempio:
+
  '''Public''' Sub Form_Open()
  '''Public''' Sub Form_MouseMove()
+
    
+
   Me.Show
   Select Case Mouse.X
+
     Case 15 To 50
+
   Dim rt As New Rect(Me.ScreenX + 10, Me.ScreenY + 10, Me.Font.TextWidth(Menu1.Text), Me.Font.TextHeight(Menu1.Text))
       If Mouse.Y < 20 Then Print "Il mouse sta passando sul Menu !"
+
   End Select
+
  Do
 +
    If rt.Contains(Mouse.ScreenX, Mouse.ScreenY) Then
 +
      Balloon.Info("Un testo qualsiasi.", Me, 10 + (Me.Font.TextWidth(Menu1.Caption) / 2), 5)
 +
     Else
 +
       Balloon.Hide
 +
    Endif
 +
<FONT Color=gray>' ''L'istruzione "Wait" consente di risparmiare risorse di sistema e di agire su eventuali Oggetti grafici posti sul "Form":''</font>
 +
    Wait 0.01
 +
   Loop
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione attuale delle 11:09, 7 gen 2022

Il caso in questione è quello in cui si vuole far apparire un Balloon sulla voce principale di un Menu, passandoci sopra con il puntatore del mouse.

Usando la Proprietà ".Tracking" del Form

La Proprietà ".Tracking" imposta se il Controllo (nel nostro caso il Form) riceverà eventi "_MouseMove()" senza il bisogno di tenere premuto un tasto del mouse, mentre ci si sposta con esso.

Mostriamo un esempio pratico, nel quale si è creato un Menu sul Form:

Public Sub Form_Open()

 Me.Tracking = True

End

Public Sub Form_MouseMove()

 Select Case Mouse.X
  Case 15 To 50
    If Mouse.Y < 20 Then 
      Balloon.Info("Il mouse sta passando sul Menu !", Me, Mouse.X, Mouse.Y)
   Else
     Balloon.Hide
   Endif 
End Select

End

Usando un Oggetto Timer

Si potrà utilizzare un Timer e la Classe Rect, per verificare la distanza del puntatore del mouse dall'angolo alto a sinistra dello schermo in rapporto con la distanza del Form, ove sono presenti le voci principali del Menu, dall'angolo alto a sinistra dello schermo.

Mostriamo un esempio pratico:

Private tm As Timer


Public Sub Form_Open()
 
 With tm = New Timer As "Tempus"
   .Delay = 50
   .Start
 End With
  
End

Public Sub Tempus_Timer()
 
 Dim rt As New Rect(Me.ScreenX + 10, Me.ScreenY + 10, Me.Font.TextWidth(Menu1.Caption), Me.Font.TextHeight(Menu1.Caption))
 
 If rt.Contains(Mouse.ScreenX, Mouse.ScreenY) Then
   Balloon.Info("Un testo qualsiasi.", Me, 10 + (Me.Font.TextWidth(Menu1.Caption) / 2), 5)
 Endif
 
End

Usando un ciclo infinito

Al posto del Timer si potrà usare un Ciclo infinito e - come sopra - la Classe Rect:

Public Sub Form_Open()

 Me.Show

 Dim rt As New Rect(Me.ScreenX + 10, Me.ScreenY + 10, Me.Font.TextWidth(Menu1.Text), Me.Font.TextHeight(Menu1.Text))

 Do
   If rt.Contains(Mouse.ScreenX, Mouse.ScreenY) Then
     Balloon.Info("Un testo qualsiasi.", Me, 10 + (Me.Font.TextWidth(Menu1.Caption) / 2), 5)
   Else
     Balloon.Hide
   Endif
' L'istruzione "Wait" consente di risparmiare risorse di sistema e di agire su eventuali Oggetti grafici posti sul "Form":
   Wait 0.01
 Loop
 
End