2008-10-04 17 views
11

मुझे एक ईवेंट को आग लगाना होगा जब माउस एक पिक्चरबॉक्स से ऊपर हो, माउस बटन के साथ पहले ही क्लिक किया गया हो और दबाया गया हो।मैं पिक्चरबॉक्स पर एक दबाए गए माउस बटन का पता कैसे लगा सकता हूं?

समस्याएं:

MouseDown और mouseenter ईवेंट हैंडलर्स एक साथ बहुत अच्छी तरह से काम नहीं करते।

उदाहरण के लिए माउस बटन पर क्लिक करने और दबाए जाने के बाद, सी # माउसडाउन इवेंट हैंडलर को आग लगाएगा, लेकिन जब कर्सर पिक्चरबॉक्स पर चलता है तो माउस बटन को तब तक नहीं चलाया जाता जब तक कि माउस बटन पुन: उपयोग नहीं किया जाता है।

उत्तर

14

माउस सबसे नियंत्रण नीचे दबाया जाता है जब होगा तब Control.Capture माउस इनपुट। इसका मतलब है कि सभी माउसमोव घटनाओं को मूल नियंत्रण में भेजा जाता है जो माउस के नियंत्रण के बजाए कब्जा कर लिया जाता है। यह तब तक जारी रहता है जब तक माउस कैप्चर नहीं करता है जो आम तौर पर माउस पर होता है।

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

Application.AddMessageFilter(myFilterClassInstance); 

तो फिर तुम एक उपयुक्त वर्ग पर IMessageFilter लागू करने की आवश्यकता ...

public class MyFilterClass : IMessageFilter 
{ 
    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_MOUSEMOVE) 
      // Check if mouse is over my picture box! 

     return false; 
    } 
} 

तो फिर तुम माउस की घटनाओं के लिए देख सकते हैं और अगर जाँच वे आपके चित्र बॉक्स पर हैं और जो भी आप करना चाहते हैं वह करें।

-1

माउस पर एक ध्वज या एक राज्य सेट करें। इसे माउस पर छोड़ दें। जब तस्वीर बॉक्स के लिए आग पर माउस पर अपने राज्य की जांच करें। अब आप पता लगा सकते हैं कि कोई व्यक्ति कुछ खींच रहा है।

13

माउस घटनाओं

सिर्फ एक माउस बटन के एक नीचे प्रेस का पता लगाने और सही करने के लिए this.Capture स्थापित करने के लिए MouseDown घटना का उपयोग करें ताकि आप तो अन्य माउस घटनाओं मिलता है, यहाँ तक कि जब माउस नियंत्रण छोड़ देता है (यानी आपको माउसलेव ईवेंट नहीं मिलेगा क्योंकि आपने माउस पर कब्जा कर लिया था)। इसे सेट करके रिलीज कैप्चर करें। माउसअप होने पर गलत होने पर कैप्चर करें।

बस माउस

यह प्रासंगिक नहीं हो सकता है की राज्य की जाँच, लेकिन आप System.Windows.Control.MousePosition देख सकें और अगर यह PictureBox.ClientRectangle में है, तो Control.MouseButtons स्थिर संपत्ति की जाँच बटन जिसके लिए नीचे हो सकता है किसी भी समय।

के रूप में:

if (pictureBox.ClientRectangle.Contains(pictureBox.PointToClient(Control.MousePosition))) 
{ 
    if ((Control.MouseButtons & MouseButtons.Left) != 0) 
    { 
    // Left button is down. 
    } 
} 
+0

Sooo पास !! MouseLeave के लिए यह.capture काम साफ़ करता है, लेकिन माउसइंटर (किसी अन्य पिक्चरबॉक्स का नहीं) –

+0

मैं पूरी तरह से समझ नहीं पाया कि आप क्या हासिल करने की कोशिश कर रहे थे, इसलिए नहीं, यह दुर्भाग्य से काम नहीं करेगा। –

3

यदि आप कुछ प्रकार के ड्रैग-एंड-ड्रॉप ऑपरेशन को लागू करने की कोशिश कर रहे हैं, तो खींचें ... प्राप्त करने वाले चित्र बॉक्स पर ईवेंट (DragEnter, DragDrop आदि) हैं जो आप उपयोग करना चाहते हैं। असल में, आप स्रोत नियंत्रण की DoDragDrop विधि का उपयोग करके ड्रैग ऑपरेशन शुरू करते हैं, और फिर आपके द्वारा खींचने वाले किसी भी नियंत्रण में ड्रैग होगा ... ईवेंट उठाए गए हैं।

एमएसडीएन पर "DoDragDrop" खोजें यह देखने के लिए कि इसे कैसे कार्यान्वित किया जाए।

+0

चीजों की आवाज़ से, यह शायद जाने का सही तरीका है। यदि यूआई ड्रैग-एंड-ड्रॉप ओरिएंटेड नहीं है, तो हम ऐसे माउस इवेंट्स की तलाश क्यों कर रहे हैं जो एक नियंत्रण में शुरू हो जाएं और दूसरे में खत्म हो जाएं? :) –

5

PictureBox नियंत्रण के भीतर एक MouseMove घटना सेट करें:

this.myPictureBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.myPictureBox_MouseMove); 

फिर, अपने MouseMove ईवेंट हैंडलर के भीतर, यह जांच लें कि बाईं माउस बटन (या जो भी) दबाया जाता है:

private void myPictureBox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
     // Do what you want to do 
} 
+0

नोट: यह एक WinForms API है, एक WPF नहीं (वैसे भी +1!) – Li3ro

0

माउस स्थिति और नियंत्रण सापेक्ष स्थिति के आधार पर एक फॉर्म को स्थानांतरित करने का सबसे अच्छा तरीका इयान कैंपबेल द्वारा पोस्ट किए गए समान है।

private void imgMoveWindow_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      Form1.ActiveForm.Left = Control.MousePosition.X - imgMoveWindow.Left - (imgMoveWindow.Size.Width/2); 
      Form1.ActiveForm.Top = Control.MousePosition.Y - imgMoveWindow.Top - (imgMoveWindow.Size.Height/2); 
     } 

    } 

जहां imgMoveWindow एक पिक्चरबॉक्स नियंत्रण है।

ब्रूनो Ratnieks

स्निफर नेटवर्क

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