.net - studio - ToolStrip a veces no responde a un clic del mouse
mouse click event c# (4)
Lo he tenido en otros entornos de desarrollo (VB6), y resultó ser porque la barra de herramientas absorbió el primer clic para adquirir el foco. O, para decirlo de otra manera, la barra de herramientas no respondería a un clic hasta que tuviera el foco. Para probar esto, intente hacer clic en una parte vacía de la barra de herramientas antes de hacer clic en el botón. Si nunca tiene que hacer clic dos veces en el botón después de hacer clic en la barra de herramientas, ese podría ser el problema. Creo que lo superaron (y esto fue hace unos años, así que disculpen el truco) fue programáticamente dar el foco a la barra de herramientas en el evento MouseOver.
Tengo una aplicación .NET 2.0 WinForms con una ToolStrip en mi formulario principal. A veces, los iconos de ToolStrip no responden al primer clic del mouse, por lo que tengo que hacer clic dos veces en el ícono. Es solo una ToolStrip estándar con varios iconos y textos de información sobre herramientas, no hago nada especial. ¿Es esto común?
Si la ventana de la aplicación no tiene el foco, debe hacer clic dos veces en el botón ToolStrip. El primer clic establece el foco en la ventana, el segundo aumenta el evento de clic. Este es (desafortunadamente) el comportamiento predeterminado y es por diseño. Microsoft Word muestra el mismo comportamiento (aunque .NET ToolStrip no tiene el mismo control).
Hace un tiempo tuve el mismo problema y encontré una solución en el blog de Rick Brewster . La idea es sobrescribir ''WndProc'' en una clase derivada ToolStripEx. El núcleo de esa solución se ve así:
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == NativeConstants.WM_MOUSEACTIVATE &&
m.Result == (IntPtr)NativeConstants.MA_ACTIVATEANDEAT)
{
m.Result = (IntPtr)NativeConstants.MA_ACTIVATE;
}
}
Puede crear su propia clase que hereda de ToolStrip y usar una propiedad personalizada ClickThrough
para activar o desactivar el comportamiento:
Public Class ToolStripExtended : Inherits ToolStrip
Private Const WM_MOUSEACTIVATE As UInteger = &H21
Private Const MA_ACTIVATE As UInteger = 1
Private Const MA_ACTIVATEANDEAT As UInteger = 2
Private Const MA_NOACTIVATE As UInteger = 3
Private Const MA_NOACTIVATEANDEAT As UInteger = 4
Private _clickThrough As Boolean = False
Public Sub New()
MyBase.New()
End Sub
'''''' <summary>
'''''' Gets or sets whether the ToolStripEx honours item clicks when its containing form does
'''''' not have input focus.
'''''' </summary>
'''''' <remarks>
'''''' Default value is false, which is the same behaviour provided by the base ToolStrip class.
'''''' </remarks>
Public Property ClickThrough() As Boolean
Get
Return Me._clickThrough
End Get
Set(value As Boolean)
Me._clickThrough = value
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If _clickThrough AndAlso m.Msg = WM_MOUSEACTIVATE AndAlso m.Result = New IntPtr(MA_ACTIVATEANDEAT) Then
m.Result = New IntPtr(MA_ACTIVATE)
End If
End Sub
End Class