2010-12-13 17 views
16

सी # में पैनल पर माउस व्हील कैप्चर कैसे करें? मैं WinFormsपैनल पर माउस व्हील कैप्चर कैसे करें?

उपयोग कर रहा हूँ

संपादित करें:

मैं PictureBox पर यह अब करने की कोशिश।

मेरे कोड:

this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);  
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick); 
private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
    { 
    MessageBox.Show("Click"); 
    } 

क्लिक करने से काम करता है। व्हीलिंग नहीं करता है। क्यों?

उत्तर

19

विंडोज़ WM_MOUSEWHEEL संदेश को उस नियंत्रण में भेजता है जिस पर फ़ोकस है। वह पैनल नहीं होगा, यह एक ऐसा नियंत्रण नहीं है जो फोकस प्राप्त कर सके। जैसे ही आप पैनल पर नियंत्रण डालते हैं, एक बटन कहें, फिर बटन फोकस और संदेश प्राप्त करता है।

बटन हालांकि संदेश के लिए कोई उपयोग नहीं है, इसे स्क्रॉल करने के लिए कुछ भी नहीं मिला है। विंडोज़ इसे नोटिस करता है और संदेश को माता-पिता को भेजता है। वह पैनल है, अब यह स्क्रॉल करेगा।

आपको एक कस्टम पैनल के लिए कोड मिलेगा this answer पर फ़ोकस प्राप्त कर सकता है।


अद्यतन: ध्यान दें कि इस व्यवहार विंडोज 10 में बदल गया है "स्क्रॉल निष्क्रिय खिड़कियों जब मैं उन्हें पर ले जाएं," विकल्प डिफ़ॉल्ट रूप से चालू है। माउस व्हील व्यवहार को ब्राउज़र में काम करने के तरीके के साथ अधिक सुसंगत बनाता है या कहता है, एक कार्यालय प्रोग्राम। इस विशिष्ट मामले में अब चित्र बॉक्स ईवेंट प्राप्त करेगा। इसके लिए बाहर देखो।

+0

पैनल के साथ ऐसा करने के तरीके के बारे में यह उत्तर देखें: http://stackoverflow.com/a/9086750/1353187 –

5

का उपयोग कर मैन्युअल रूप से इसे तार अप करने के लिए हासिल की है ...

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel); 

private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    ///process mouse event 
} 

आसान विधि पैनल पर दृश्य स्टूडियो क्लिक में है, गोटो गुण viewpanel, चयन की घटनाओं का पता लगाने, और "mousewheel" घटना पर डबल क्लिक करें।

+2

मैं माउसव्हील नहीं देख सकता है माउसव्हील घटना प्राप्त करने के लिए है। MouseCaptureChanged, MouseClick, MouseDoubleClick, MouseDown, MouseEnter, MouseHover, MpouseLeave, MouseMove, MouseUp –

+1

अजीब है कि आप सही हैं। निश्चित नहीं है कि विजुअल स्टूडियो में यह क्यों सूचीबद्ध नहीं है। यदि आप मैन्युअल रूप से इसे तार करते हैं तो यह काम करता है। माउसहेल ईवेंट का उपयोग करके यहां एक उदाहरण प्रोग्राम है। http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx –

+2

Fwiw, यह गुण दृश्यमान में दिखाई नहीं देता है क्योंकि इस घटना की घोषणा को सजाया गया है "[ब्राउज़ करने योग्य (गलत)]"। साथ ही, यह इंटेलिसेन्स के स्वत: पूर्ण पैनल में दिखाई नहीं देगा जब तक कि उन्नत सदस्यों को दिखाने के लिए वीएस स्थापित नहीं किया जाता है (मुझे विश्वास है कि वीबी इन्हें छुपाता है, जबकि सी # डिफ़ॉल्ट रूप से नहीं होता है) - और ऐसा इसलिए होता है क्योंकि इसे "[संपादक ब्रोसेबल (EditorBrowsableState) उन्नत)] "। –

21

यदि आप किसी घटक पर "माउसहेल" ईवेंट नहीं देख पा रहे हैं, तो आपको इसे मैन्युअल रूप से बनाना होगा। इसके अलावा, हमें उस घटक पर ध्यान केंद्रित करने की आवश्यकता है, अन्यथा "माउसहेल" ईवेंट उस घटक के लिए काम नहीं करेगा। मैं आपको दिखाऊंगा कि "pictureBox1" के लिए "माउसहेल" ईवेंट कैसे बनाएं और यह कैसे काम करता है।

  1. कंस्ट्रक्टर के अंदर, उस घटक पर एक मूसहेल घटना बनाएं।

    InitializeComponent(); 
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel; 
    
  2. मैन्युअल रूप से फ़ंक्शन बनाएं। मेरे उदाहरण के अनुसार, यह "pictureBox1_MouseWheel" कॉल

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e) 
    { 
        //you can do anything here 
    } 
    
  3. कि घटक पर एक MouseHover ईवेंट बनाएं (PicureBox1, चयन स्थिति में गुण पर जाएँ, का पता लगाने "MouseHover" और "MouseHover" घटना डबल क्लिक करें)।

  4. कॉल करें "फोकस()"; उस MouseHover घटना के अंदर विधि।

    pictureBox1.Focus(); 
    
  5. अब प्रोग्राम चलाएं।

+1

ए डब्ल्यू ओ एस ओ ई लड़का! मेरे मामले में मुझे 'माउस/स्क्रॉल इवेंट एरग्स' की आवश्यकता नहीं है इसलिए मैंने 'निजी शून्य EventFunc (ऑब्जेक्ट प्रेषक, EventArgs e)' सेट किया है। इस तरह मैं एक ही समारोह पर दोनों हैंडलर (स्क्रॉल और मूसहेल) स्थापित कर सकता हूं :)। स्वच्छ। – C4u

+0

यह उत्तर है! धन्यवाद। – jonathana

+0

स्वीकार्य उत्तर होना चाहिए – Akumaburn

1

मूसहेल घटनाएं प्राप्त करना मुश्किल है। सबसे आसान तरीका है इस तरह से प्रपत्र नियंत्रण के बजाय घटना हो जाता है

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

बजाय

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

उपयोग कर रहा है। इस तरह से आसान है लेकिन एक समस्या है: आप अपने फॉर्म में केवल एक मूसहेल घटना का उपयोग कर सकते हैं।

आप एक से अधिक नियंत्रण का सबसे अच्छा तरीका This answer by "Shehan Silva - weltZ"

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