2009-02-03 18 views
5

MFC में एक डबल माउस क्लिक ईवेंट ट्रिगर संदेशों के निम्न क्रमMFC में एक भी माउस क्लिक का पता लगा रहा

  • WM_LBUTTONDOWN
  • WM_LBUTTONUP
  • WM_LBUTTONDBCLK
  • WM_LBUTTONUP

तो का जवाब देना WM_LBUTTONDBCLK संदेश आपको डबल का पता लगाने की अनुमति देता है क्लिक करें। लेकिन अगर मैं सिर्फ एक-क्लिक का पता लगाना चाहता हूं तो मैं इसे कैसे अलग कर सकता हूं?

लेकिन पर देखकर WM_LBUTTONUP संदेश पर्याप्त नहीं है क्योंकि यह एक-क्लिक हो सकता है या यह डबल-क्लिक का पहला क्लिक हो सकता है।

मैं केवल एक-क्लिक को सफलतापूर्वक कैसे पहचान सकता हूं?

उत्तर

10

(कृपया मुझे इन घटनाओं माउस ऊपर और माउस बटन दबाने कॉल करने के लिए अनुमति देते हैं। मेरे MFC कुछ पुरानी है। और वहाँ इस चीज है जो मेरे शब्दावली हाल ही में ;-)

लघु कहानी अप खिलवाड़ किया गया नेट कहा जाता है : आप बस माउस क्लिक के बारे में जानना नहीं चाहते हैं। तुम्हे और चाहिए।

लंबी कहानी:

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

तर्क आगे बढ़ते हुए, आपको माउस डाउन संसाधित करने के बाद माउस अप प्राप्त करने पर भरोसा नहीं करना चाहिए: उपयोगकर्ता ने माउस को स्थानांतरित कर दिया है और कहीं और बटन को छोड़ दिया है (ड्रैग'ड्रॉप सोचें), इस मामले में, आपको माउसअप इवेंट प्राप्त नहीं होता है ... जब तक कि आप माउस डाउन पर माउस को कैप्चर नहीं करते हैं, यह सुनिश्चित करने के लिए कि माउस को माउस विंडो तक ले जाएं, भले ही माउस ने आपकी विंडो छोड़ी हो।

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

निष्कर्ष में: कोई माउसक्लिक संदेश नहीं है क्योंकि आप इसके साथ बहुत दूर नहीं जाएंगे: आपको अधिक संदेशों को संभालने और वैसे भी अधिक यांत्रिकी को लागू करने की आवश्यकता है।

ओह! और यदि आप मौजूदा नियंत्रण से निपट रहे हैं जो पहले से ही इन सभी आइटमों और चयन सामग्री को प्रबंधित करता है, जैसे सूचीदृश्य, संभावना है कि यह एक समान कस्टम अधिसूचना प्रदान करता है जैसे आइटम सक्रिय या आइटम चयन बदल गया।

-2

आप आमतौर पर @MLButtonUp पर देखते हैं और आपके पास एक ही माउस बटन पर सिंगल क्लिक और डबल क्लिक व्यवहार नहीं होता।

0

आप WM_LBUTTONDOWN को WM_LBUTTONUP से पहले एक से अधिक बार नहीं बुला सकते थे। प्रैक्टिस में विंडोज यह आपके लिए करता है, उसमें यदि आपको WM_LBUTTONDBCLK मिलता है तो आपको WM_LBUTTONUP नहीं मिलता है।

0

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

जहां तक ​​मुझे पता है कि यह पता नहीं है कि ऐसा होने का मामला है, जो समझ में आता है - समय समाप्त होने तक, यह जानने का कोई तरीका नहीं है कि दूसरा क्लिक है या नहीं अ रहे है।

0

यह थोड़ा मुश्किल है।

मैं WM_LBUTTONDOWN & WM_LBUTTONUP कॉम्बो का पता लगाऊंगा, उस घटना को कहीं और स्टोर करें और एक या दूसरे के लिए टाइमआउट सेट करें। यदि उस टाइमआउट के दौरान WM_LBUTTONDBCLK नहीं है तो आपके पास एक क्लिक है।

यह आपको इंगित कर सकता है कि आपको एक और धागा चलाना होगा, लेकिन मुझे लगता है कि आप इसे एक थ्रेड के साथ पूरा कर सकते हैं।

1

मैंने डेल्फी में यह कोशिश की, व्यवहार समान है: यहां तक ​​कि जब एक डबल क्लिक हो रहा है, तो दोनों में से एक के बाद एक क्लिक क्लिक जारी किया जाता है।

मैं एक टाइमर है, जो इस तरह काम करता है का उपयोग कर इसे हल:

  • निष्क्रिय WM_LBUTTONDBLCLK पर टाइमर (और true को bDbl सेट) यदि bDbl==false
  • WM_LBUTTONUP पर
  • सक्रिय टाइमर WM_LBUTTONUP पर निष्क्रिय कर देते हैं bDbl==true (और रीसेट bDbl)

मैंने पूर्णांक सेट किया GetDoubleClickTime द्वारा लौटाए गए समय के टाइमर का रावल।

MSDN कहते हैं:

GetDoubleClickTime समारोह को पुन: प्राप्त माउस के लिए मौजूदा डबल क्लिक करें समय। एक डबल-क्लिक माउस बटन के दो क्लिकों की एक श्रृंखला है, दूसरा पहले के बाद निर्दिष्ट समय के भीतर होता है। डबल-क्लिक समय अधिकतम मिलीसेकंड की संख्या है जो के पहले और दूसरे क्लिक के बीच एक डबल-क्लिक हो सकता है।

यदि टाइमर आग लगती है तो आपके पास वास्तविक क्लिक होता है। मेरे मामले में डबल क्लिक अंतराल 500ms है, इसलिए इस "वास्तविक क्लिक" में इस देरी में देरी होगी।

0

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

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