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
5条答案
按热度按时间pes8fvy91#
不久前我遇到了同样的问题,我在Rick Brewster's blog中找到了解决方案,引用了this link。这个想法是在派生类ToolStripEx中覆盖'WndProc'。该解决方案的核心看起来像这样:
字符串
pbwdgjma2#
您可以创建自己的类,继承自ToolStrip,并使用自定义属性
ClickThrough
来打开或关闭行为:字符串
wwtsj6pe3#
我在其他开发环境(VB6)中遇到过这种情况,结果是因为第一次单击被工具栏吸收以获取焦点。或者,换句话说,工具栏不会响应单击 *,直到 * 它有焦点。要测试这一点,请尝试在单击按钮之前单击工具栏的空白部分。如果你从来没有点击两次按钮后,你已经点击了工具栏,那么这可能是问题。我想他们我解决了这个问题(这是几年前的事了,所以请原谅我的黑客行为)是在MouseOver事件中通过编程给予焦点放在工具栏上。
z4iuyo4d4#
如果应用程序窗口没有获得焦点,则必须单击ToolStrip按钮两次。第一次单击将焦点设置为窗口,第二次单击将引发click事件。这是(不幸的是)默认行为,而且是有意为之。Microsoft Word显示相同的行为(即使.NET ToolStrip不是同一个控件)。
xkftehaa5#
以下是@Doc Brown的解决方案的实现:
字符串