2009-01-23 9 views
5

मेरे पास मेरे मुख्य रूप पर टूलस्ट्रिप के साथ एक .NET 2.0 WinForms एप्लिकेशन है। कभी-कभी, टूलस्ट्रिप आइकन पहले माउस क्लिक पर resppond नहीं करते हैं, इसलिए मुझे आइकन को दो बार क्लिक करना होगा। यह कई आइकन और टूलटिप ग्रंथों के साथ एक मानक टूलस्ट्रिप है, मैं कुछ भी विशेष नहीं करता हूं। क्या यह आम है?टूलस्ट्रिप कभी-कभी माउस पर प्रतिक्रिया नहीं दे रहा है

उत्तर

0

यदि एप्लिकेशन विंडो को फोकस नहीं मिला है, तो आपको टूलस्ट्रिप बटन को दो बार क्लिक करना होगा। पहला क्लिक विंडो पर फोकस सेट करता है, दूसरा क्लिक इवेंट बढ़ाता है। यह (दुर्भाग्य से) डिफ़ॉल्ट व्यवहार है और यह डिज़ाइन द्वारा है। माइक्रोसॉफ्ट वर्ड एक ही व्यवहार दिखाता है (भले ही .NET ToolStrip एक ही नियंत्रण नहीं है)।

+5

एमएस वर्ड और .NET टूलस्ट्रिप बटन के बीच एक अंतर है: जब Word अनुप्रयोग में फोकस नहीं होता है, तो Word में मेनू और प्रतीकों को माउस कर्सर द्वारा हाइलाइट नहीं किया जाता है। जब वे फोकस करते हैं तो उन्हें केवल हाइलाइट किया जाता है। दूसरी तरफ, .NET ToolStrip अपने बटन को हाइलाइट करता है, भले ही एप्लिकेशन में फोकस न हो, नाटक करें कि माउस क्लिक तुरंत बटन को सक्रिय करेगा। –

1

मेरे पास अन्य देव वातावरण (वीबी 6) में है, और ऐसा इसलिए हुआ क्योंकि फोकस हासिल करने के लिए टूलबार द्वारा पहला क्लिक अवशोषित किया जा रहा था। या, इसे एक और तरीका रखने के लिए, टूलबार पर पर क्लिक नहीं करेगा, इसका ध्यान केंद्रित किया गया था। इसका परीक्षण करने के लिए, बटन पर क्लिक करने से पहले टूलबार के खाली भाग पर क्लिक करने का प्रयास करें। टूलबार पर क्लिक करने के बाद आपको बटन पर दो बार क्लिक नहीं करना पड़ता है तो यह समस्या हो सकती है। मुझे लगता है कि वे इसके चारों ओर मिल गए (और यह साल पहले था, इसलिए कृपया हैक क्षमा करें) प्रोग्रामओटिक रूप से माउसओवर घटना में टूलबार पर ध्यान देना था।

+0

धन्यवाद ऐसा लगता है कि यह मेरा मामला नहीं है। अगर मैं किसी अन्य नियंत्रण पर ध्यान केंद्रित करता हूं (आइए टूलस्ट्रिप के बाहर एक बटन कहें) और फिर टूलस्ट्रिप बटन पर क्लिक करें, तो क्लिक स्वीकार किया जाता है। – user20353

20

मुझे कुछ बार पहले एक ही समस्या थी, और मुझे 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; 
    } 
} 
+0

यह सही है, मैंने कोशिश किए गए विकल्पों में से किसी भी से बेहतर है। – user169771

+0

इसी तरह का समाधान: https://stackoverflow.com/a/4967537/767664 – Pedro77

1

आप अपनी खुद की कक्षा कि 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 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^