sirve - tooltip visual studio c#
Mostrando una informaciĆ³n sobre herramientas en un ToolStripItem no enfocado (4)
El problema es que los "controles" ToolStrip como ToolStripButton o ToolStripDropDownButton no heredan de Control. Por ahora, resolví el problema enfocando la ToolStrip cada vez que un usuario pasa el mouse sobre un botón. El evento MouseHover del botón se activa demasiado tarde, después de que se haya ejecutado el código de "mostrar información sobre herramientas", por lo que amplié la clase ToolStripDropDownButton y usé mi nuevo botón. Este método debería funcionar para cualquiera de las otras clases tipo botón heredadas 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);
}
}
ToolStripItems muestra resaltado activo al pasar el mouse sobre ellos, incluso si el formulario en el que se encuentran no está enfocado. Sin embargo, no muestran su información sobre herramientas, a menos que el formulario esté enfocado. He visto el truco ToolStrip ''click-though'' . ¿Alguien sabe cómo hacer que ToolStripButton muestre su información sobre herramientas cuando su forma principal no está enfocada?
¡Gracias!
Intentaba hacer lo mismo y determiné que iba a ser bastante desafiante y que no valía la pena. La razón es que, internamente, el código .NET está específicamente diseñado para mostrar solo la información sobre herramientas si la ventana está activa; lo están verificando en un nivel Win32, por lo que será difícil falsificar el código.
Aquí está el fragmento de código en ToolTip.cs que verifica "GetActiveWindow ()" y devuelve falso. Puede ver el comentario en el código "La información sobre herramientas debe mostrarse únicamente en Windows activo".
Por cierto, puedes ver todo el código fuente de .NET BCL con Visual Studio 2008, estas son las instrucciones que utilicé:
// 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;
}
Tal vez uno de los dos enfoques en este código te lleve en la dirección correcta ...
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();
}
El problema con el primero es que no puede establecerlo en el botón directamente, no hereda de Control, y la información sobre herramientas no se mostrará a menos que esté sobre la tira, pero no sobre un botón.
El problema con el segundo (modo comentado) es que no se muestra en absoluto. No estoy seguro de por qué, pero quizás puedas depurarlo.
intenté algunas cosas y encontré que esta era la más simple
cuando creo los elementos de la barra de herramientas agregué un controlador de eventos a su evento de desplazamiento:
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
luego el controlador de eventos:
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
esto funciona muy bien, aunque noto un pequeño retraso inicial cuando pasas la tira de herramientas por primera vez