2008-09-27 3 views
7

ToolStripItems affiche la surbrillance Active lorsque vous passez la souris dessus, même si le formulaire dans lequel ils se trouvent n'est pas actif. Cependant, ils ne montrent pas leurs infobulles, à moins que le formulaire ne soit ciblé. J'ai vu le ToolStrip 'click-though' hack. Quelqu'un sait-il comment afficher une info-bulle ToolStripButton lorsque son formulaire parent n'est pas au point?Affichage d'une info-bulle sur un ToolStripItem non ciblé

Merci!

+0

Pourquoi voulez-vous faire cela? Le bug est plutôt le suivi actif lorsque le formulaire n'est pas focalisé. – OregonGhost

+0

@OregonGhost - J'ai créé une barre d'outils flottante/toujours visible et je voulais que les info-bulles s'affichent au passage de la souris même lorsque d'autres applications étaient actives. – foson

Répondre

2

Peut-être l'une des deux approches dans ce code vous lancer dans la bonne direction ...

public Form1() 
{ 
    InitializeComponent(); 

    tooltip = new ToolTip(); 
    tooltip.ShowAlways = true; 
} 

private ToolTip tooltip; 
private void toolStripButton_MouseHover(object sender, EventArgs e) 
{ 
    if (!this.Focused) 
    { 
     ToolStripItem tsi = (ToolStripItem)sender; 
     tooltip.SetToolTip(toolStrip1, tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text); 
     /*tooltip.Show(tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text, this, 
      new Point(toolStrip1.Left, toolStrip1.Bottom));*/ 
    } 
} 

private void toolStripButton_MouseLeave(object sender, EventArgs e) 
{ 
    tooltip.RemoveAll(); 
} 

Le problème avec la première est que vous ne pouvez pas le régler sur le bouton directement, il doesn N'héritez pas de Control, et l'info-bulle ne s'affichera que si vous êtes sur la bande mais pas sur un bouton.

Le problème avec le second (commenté dehors) est qu'il ne s'affiche pas du tout. Je ne sais pas trop pourquoi, mais peut-être que vous pouvez le déboguer.

5

Le problème est que les «contrôles» ToolStrip comme ToolStripButton ou ToolStripDropDownButton n'héritent pas de contrôle. Pour l'instant, j'ai résolu le problème en focalisant la ToolStrip chaque fois qu'un utilisateur passe la souris sur un bouton. L'événement MouseHover du bouton est déclenché trop tard - après l'exécution du code "show tooltip", j'ai donc étendu la classe ToolStripDropDownButton et utilisé mon nouveau bouton. Cette méthode devrait fonctionner pour l'une des autres boutons ressemblant à des classes héritant de ToolStripItem

public class ToolStripDropDownEx : ToolStripDropDownButton 
{ 
    public ToolStripDropDownEx(string text) 
    { 
    } 

    protected override void OnMouseHover(EventArgs e) 
    { 
     if (this.Parent != null) 
      Parent.Focus(); 
     base.OnMouseHover(e); 
    } 
} 
1

Je tentais de faire la même chose et a déterminé qu'il allait être assez difficile et pas la peine. La raison en est qu'en interne, le code .NET est spécifiquement conçu pour afficher uniquement l'info-bulle si la fenêtre est active - ils vérifient cela au niveau Win32, il sera donc difficile de truquer le code.

Voici l'extrait de code dans ToolTip.cs qui vérifie "GetActiveWindow()" et renvoie false. Vous pouvez voir le commentaire dans le code "ToolTips devrait être montré uniquement sur Windows actif."

Par ailleurs, vous pouvez voir tout le code source de la BCL .NET avec Visual Studio 2008, voici les instructions que j'ai utilisé:

http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

// refer VsWhidbey 498263: ToolTips should be shown only on active Windows. 
private bool IsWindowActive(IWin32Window window) 
{ 
    Control windowControl = window as Control; 
    // We want to enter in the IF block only if ShowParams does not return SW_SHOWNOACTIVATE. 
    // for ToolStripDropDown ShowParams returns SW_SHOWNOACTIVATE, in which case we DONT want to check IsWindowActive and hence return true. 
    if ((windowControl.ShowParams & 0xF) != NativeMethods.SW_SHOWNOACTIVATE) 
    { 
     IntPtr hWnd = UnsafeNativeMethods.GetActiveWindow(); 
     IntPtr rootHwnd =UnsafeNativeMethods.GetAncestor(new HandleRef(window, window.Handle), NativeMethods.GA_ROOT); 
     if (hWnd != rootHwnd) 
     { 
      TipInfo tt = (TipInfo)tools[windowControl]; 
      if (tt != null && (tt.TipType & TipInfo.Type.SemiAbsolute) != 0) 
      { 
       tools.Remove(windowControl); 
       DestroyRegion(windowControl); 
      } 
      return false; 
     } 
    } 
    return true; 
} 
2

J'ai essayé quelques petites choses et trouvé que ce soit le plus simple

quand je crée les éléments de ToolStripButton i ajouté un gestionnaire d'événements à son événement vol stationnaire:

private sub SomeCodeSnippet() 

    Me.tooltipMain.ShowAlways = True 

    Dim tsi As New ToolStripButton(String.Empty, myImage) 
    tsi.ToolTipText = "my tool tip text" 
    toolstripMain.Add(tsi) 

    AddHandler tsi.MouseHover, AddressOf ToolStripItem_MouseHover 

end sub 

alors le gestionnaire d'événements:

Private Sub ToolStripItem_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) 

    If TypeOf sender Is ToolStripButton Then 
     Me.tooltipMain.SetToolTip(Me.toolstripMain, CType(sender, ToolStripButton).ToolTipText) 
    End If 

End Sub 

cela fonctionne vraiment bien, même si je remarque un petit retard initial lorsque vous passez la souris sur la toolstrip pour la 1ère fois

Questions connexes