मेरे पास मेरे मुख्य रूप पर टूलस्ट्रिप के साथ एक .NET 2.0 WinForms एप्लिकेशन है। कभी-कभी, टूलस्ट्रिप आइकन पहले माउस क्लिक पर resppond नहीं करते हैं, इसलिए मुझे आइकन को दो बार क्लिक करना होगा। यह कई आइकन और टूलटिप ग्रंथों के साथ एक मानक टूलस्ट्रिप है, मैं कुछ भी विशेष नहीं करता हूं। क्या यह आम है?टूलस्ट्रिप कभी-कभी माउस पर प्रतिक्रिया नहीं दे रहा है
उत्तर
यदि एप्लिकेशन विंडो को फोकस नहीं मिला है, तो आपको टूलस्ट्रिप बटन को दो बार क्लिक करना होगा। पहला क्लिक विंडो पर फोकस सेट करता है, दूसरा क्लिक इवेंट बढ़ाता है। यह (दुर्भाग्य से) डिफ़ॉल्ट व्यवहार है और यह डिज़ाइन द्वारा है। माइक्रोसॉफ्ट वर्ड एक ही व्यवहार दिखाता है (भले ही .NET ToolStrip एक ही नियंत्रण नहीं है)।
मेरे पास अन्य देव वातावरण (वीबी 6) में है, और ऐसा इसलिए हुआ क्योंकि फोकस हासिल करने के लिए टूलबार द्वारा पहला क्लिक अवशोषित किया जा रहा था। या, इसे एक और तरीका रखने के लिए, टूलबार पर पर क्लिक नहीं करेगा, इसका ध्यान केंद्रित किया गया था। इसका परीक्षण करने के लिए, बटन पर क्लिक करने से पहले टूलबार के खाली भाग पर क्लिक करने का प्रयास करें। टूलबार पर क्लिक करने के बाद आपको बटन पर दो बार क्लिक नहीं करना पड़ता है तो यह समस्या हो सकती है। मुझे लगता है कि वे इसके चारों ओर मिल गए (और यह साल पहले था, इसलिए कृपया हैक क्षमा करें) प्रोग्रामओटिक रूप से माउसओवर घटना में टूलबार पर ध्यान देना था।
धन्यवाद ऐसा लगता है कि यह मेरा मामला नहीं है। अगर मैं किसी अन्य नियंत्रण पर ध्यान केंद्रित करता हूं (आइए टूलस्ट्रिप के बाहर एक बटन कहें) और फिर टूलस्ट्रिप बटन पर क्लिक करें, तो क्लिक स्वीकार किया जाता है। – user20353
मुझे कुछ बार पहले एक ही समस्या थी, और मुझे Rick Brewster's blog में एक समाधान मिला। विचार एक व्युत्पन्न वर्ग ToolStripEx में 'WndProc' को ओवरराइट करना है। कि समाधान के मूल इस तरह दिखता है:
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;
}
}
यह सही है, मैंने कोशिश किए गए विकल्पों में से किसी भी से बेहतर है। – user169771
इसी तरह का समाधान: https://stackoverflow.com/a/4967537/767664 – Pedro77
आप अपनी खुद की कक्षा कि ToolStrip से विरासत बना सकते हैं और चालू या बंद व्यवहार स्विच करने के कोई कस्टम गुण ClickThrough
उपयोग कर सकते हैं:, वैसे भी
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
एमएस वर्ड और .NET टूलस्ट्रिप बटन के बीच एक अंतर है: जब Word अनुप्रयोग में फोकस नहीं होता है, तो Word में मेनू और प्रतीकों को माउस कर्सर द्वारा हाइलाइट नहीं किया जाता है। जब वे फोकस करते हैं तो उन्हें केवल हाइलाइट किया जाता है। दूसरी तरफ, .NET ToolStrip अपने बटन को हाइलाइट करता है, भले ही एप्लिकेशन में फोकस न हो, नाटक करें कि माउस क्लिक तुरंत बटन को सक्रिय करेगा। –