2009-02-13 18 views
5

मान लीजिए कि WinForms एप्लिकेशन में प्रत्येक प्रपत्र के लिए, आप कर्सर को WaitCursor में बदलना चाहते हैं। यह करने के लिए स्पष्ट तरीका है हर जगह है जहाँ एक रूप instantiated है/दिखाया में कोड जोड़ना होगा:वीबी.नेट 2005 - "ग्लोबल" इवेंट हैंडलर?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

Catch ex As Exception 
    Throw 
Finally 
    Me.Cursor = Cursors.Default 
End Try 

हालांकि, अगर वहाँ एक रास्ता अपने आवेदन बताने के लिए है मैं सोच रहा था, "जब भी किसी भी रूप लोड घटना आग लगती है, एक प्रतीक्षा कर्सर दिखाएं। जब फॉर्म इवेंट दिखाया गया है, तो कर्सर को डिफ़ॉल्ट पर सेट करें। " इस तरह, मी। कर्सर कोड केवल एक ही स्थान पर हो सकता है और पूरे एप्लिकेशन में बिखरा नहीं जा सकता - और इसे प्रत्येक फॉर्म तत्काल में डालने के लिए नहीं भूल जाता है।

मैं आप नियमित रूप से फार्म वर्ग उपवर्ग और एक ओवरराइड स्थिति में कर्सर सेटिंग्स जोड़ सकते हैं लगता है, लेकिन मैं आपको दृश्य डिजाइनर क्षमता खो देते हैं जब आप फार्म वस्तु उपवर्ग विश्वास करते हैं।

+0

मुझे आशा है कि आपको पता है कि कैच हिस्सा पूरी तरह व्यर्थ है? (और बाहर छोड़ा जाना चाहिए) –

+0

मेरे पास मेरे कैच ब्लॉक में अन्य कोड है। यह एक सरलीकृत उदाहरण है। – HardCode

उत्तर

2

अपने प्रश्न का उत्तर देने के लिए - आप जो चाहते हैं उसे प्राप्त करने के लिए कोई वैश्विक .Net ईवेंट नहीं हैं। इस के लिए कोई शुद्ध नेट कनेक्शन नहीं है। आप आस्पेक्ट ओरिएंटेड प्रोग्रामिंग और क्रॉस कटिंग कंसर्न पर एक नज़र डाल सकते हैं - इसके लिए एक एओपी समाधान हो सकता है (कुछ गुगलिंग शुरू हो जाएंगी, फिर विवरण के लिए यहां पोस्ट करें)।

हालांकि, Win32 मैसेजिंग का उपयोग करके आप इसे कैसे प्राप्त कर सकते हैं, इस बारे में एक संपूर्ण समाधान के बजाय एक विचार अधिक है।

  1. आपको यह जानने की ज़रूरत है कि Win32 संदेश लोड ईवेंट से मेल खाते हैं और यदि कोई Win32 संदेश है जो लोड ईवेंट के बाद हमेशा होता है। लोड इवेंट के लिए एक उम्मीदवार WM_SHOWWINDOW हो सकता है लेकिन मुझे यकीन नहीं है।
  2. एक संदेश फ़िल्टर क्लास लिखें (यानी IMessageFilter लागू करें)।
  3. संदेश में फ़िल्टर श्रेणी की प्रीमेसेजफिल्टर विधि संदेश प्रकार की जांच करें और यदि यह सही पैरामीटर के साथ एक WM_SHOWWINDOW (या जो भी) संदेश है तो आप कर्सर को सेट/रीसेट कर सकते हैं (Cursor.Current = Cursors.WaitCursor का उपयोग करके - फिर आपको आवश्यकता है इसका परीक्षण करने के लिए)
+0

एक विचार की तरह लगता है। धन्यवाद! मैं इसमें देख लूंगा। – HardCode

3

सबक्लासिंग एक विकल्प है, जब तक आप सुपरक्लास को अनिवार्य रूप से सेट नहीं करते हैं, तब तक आप डिज़ाइनर को नहीं हटाते हैं, यह वास्तव में ऐसा नहीं है।

1

एक और विकल्प जिसमें सबक्लासिंग शामिल नहीं है, फॉर्म प्रकार में एक एक्सटेंशन विधि जोड़ना है। फिर आप शो के बजाय अपनी एक्सटेंशन विधि (ShowAndWait() जैसी कुछ कह सकते हैं। आप कॉल करने वाले भी हो सकते हैं यह दिखाएं कि क्या आप इसे एक अलग हस्ताक्षर से अधिभारित करते हैं।

+0

मैं अपनी शब्दावली को भ्रमित कर सकता हूं, लेकिन विस्तारित विधियां VS.NET 2008 के लिए नई नहीं हैं? मैं 2005 का उपयोग कर रहा हूं। यदि नहीं, तो मैं इसे आज़माउंगा। – HardCode

+0

आप सही हैं। वे 2008 के लिए नए हैं –

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