[C#] Affichage d'une info-bulle sur un ToolStripItem non ciblé


Answers

Peut-être que l'une des deux approches de ce code vous amènera 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 le premier est que vous ne pouvez pas le régler directement sur le bouton, il n'hérite pas de Control, et l'info-bulle n'apparaîtra pas à moins que vous soyez sur la bande mais pas sur un bouton.

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

Question

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 hack ToolStrip 'click-though' . Quelqu'un sait-il comment afficher une info-bulle ToolStripButton lorsque son formulaire parent n'est pas au point?

Merci!




J'essayais de faire la même chose et j'ai déterminé que ça allait être difficile et que ça ne valait pas le coup. 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."

En passant, vous pouvez voir tout le code source pour le .NET BCL avec Visual Studio 2008, voici les instructions que j'ai utilisées:

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;
}