Affichage d’une info-bulle sur un ToolSsortingpItem non ciblé

ToolSsortingpItems affiche la surbrillance active lorsque vous les survolez, même si la fiche dans laquelle ils se trouvent n’est pas active Cependant, ils ne montrent pas leurs info-bulles, à moins que le formulaire ne soit ciblé. J’ai vu le bidouillage “clic-bien” de ToolSsortingp . Quelqu’un sait comment faire en sorte qu’un ToolSsortingpButton affiche son info-bulle lorsque son formulaire parent n’est pas actif?

Merci!

Le problème est que les “contrôles” ToolSsortingp tels que ToolSsortingpButton ou ToolSsortingpDropDownButton n’héritent pas de Control. Pour l’instant, j’ai résolu le problème en concentrant le ToolSsortingp chaque fois qu’un utilisateur survole un bouton. L’événement MouseHover du bouton est déclenché trop tard – après que le code “show tooltip” ait été exécuté, j’ai donc étendu la classe ToolSsortingpDropDownButton et utilisé mon nouveau bouton. Cette méthode devrait fonctionner pour toutes les autres classes de type bouton héritant de ToolSsortingpItem.

public class ToolSsortingpDropDownEx : ToolSsortingpDropDownButton { public ToolSsortingpDropDownEx(ssortingng text) { } protected override void OnMouseHover(EventArgs e) { if (this.Parent != null) Parent.Focus(); base.OnMouseHover(e); } } 

Peut-être que l’une des deux approches de ce code vous lancera dans la bonne direction …

 public Form1() { InitializeComponent(); tooltip = new ToolTip(); tooltip.ShowAlways = true; } private ToolTip tooltip; private void toolSsortingpButton_MouseHover(object sender, EventArgs e) { if (!this.Focused) { ToolSsortingpItem tsi = (ToolSsortingpItem)sender; tooltip.SetToolTip(toolSsortingp1, tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text); /*tooltip.Show(tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text, this, new Point(toolSsortingp1.Left, toolSsortingp1.Bottom));*/ } } private void toolSsortingpButton_MouseLeave(object sender, EventArgs e) { tooltip.RemoveAll(); } 

Le problème avec le premier est que vous ne pouvez pas le définir directement sur le bouton, il n’hérite pas de Control et l’info-bulle n’apparaîtra que si vous survolez la bande mais pas le bouton.

Le problème avec le deuxième moyen (commenté) est qu’il ne s’affiche pas du tout. Vous ne savez pas trop pourquoi, mais vous pouvez peut-être le déboguer.

j’ai essayé quelques petites choses et j’ai trouvé que c’était le plus simple

Lorsque je crée les éléments toolssortingpbutton, j’ai ajouté un gestionnaire d’événements à son événement survol:

 private sub SomeCodeSnippet() Me.tooltipMain.ShowAlways = True Dim tsi As New ToolSsortingpButton(Ssortingng.Empty, myImage) tsi.ToolTipText = "my tool tip text" toolssortingpMain.Add(tsi) AddHandler tsi.MouseHover, AddressOf ToolSsortingpItem_MouseHover end sub 

puis le gestionnaire d’événement:

 Private Sub ToolSsortingpItem_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) If TypeOf sender Is ToolSsortingpButton Then Me.tooltipMain.SetToolTip(Me.toolssortingpMain, CType(sender, ToolSsortingpButton).ToolTipText) End If End Sub 

cela fonctionne vraiment bien, bien que je remarque un premier retard minime lorsque vous survolez la bande d’outils pour la première fois

J’essayais de faire la même chose et je décidais que ce serait assez difficile et que cela n’en valait pas la peine La raison en est qu’en interne, le code .NET est spécifiquement conçu pour afficher l’info-bulle uniquement si la fenêtre est active – ils le vérifient au niveau Win32, ce qui rend difficile la reproduction du code.

Voici l’extrait de code dans ToolTip.cs qui vérifie “GetActiveWindow ()” et renvoie false. Vous pouvez voir le commentaire dans le code “Les info-bulles doivent être affichées uniquement sous Windows actif”.

Au fait, vous pouvez voir tout le code source du .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 ToolSsortingpDropDown 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; }