स्क्रॉल पट्टी या माउस बटन छोड़ने के बाद स्क्रॉल करने के लिए जारी रहती है


लक्षण


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

कारण


यह समस्या तब होती है जब आमतौर पर एक संदेश पुनर्प्राप्ति लूप स्क्रॉलिंग स्क्रॉल पट्टी सूचना संदेशों में से एक पर प्राप्त करने के लिए की गई क्रिया का परिणाम के रूप में निष्पादित की है।


एक आंतरिक संदेश पुनर्प्राप्ति लूप में स्क्रॉल करते हैं, Windows में प्रारंभ होती है। यह संदेश लूप के कार्य का ट्रैक रखने में स्क्रॉल करने के लिए और उपयुक्त स्क्रॉल पट्टी सूचना संदेशों, और WM_VSCROLL WM_HSCROLL भेजने के लिए है। WM_LBUTTONUP प्राप्त होने के बाद स्क्रॉल करना बंद कर दिया है। WM_LBUTTONUP स्क्रॉलिंग के दौरान किसी अन्य संदेश लूप प्रारंभ किया जाता है, तो वह संदेश लूप द्वारा लाया है, और किसी अनुप्रयोग तक पहुँच करने के लिए स्क्रॉल पट्टी का आंतरिक संदेश पुनर्प्राप्ति लूप नहीं है, क्योंकि WM_LBUTTONUP ठीक से भेजा गया हो सकता है। इसलिए, आंतरिक संदेश retriever द्वारा WM_LBUTTONUP कभी भी प्राप्त किया है, और स्क्रॉलिंग कभी भी समाप्त हो गया है।


स्क्रॉलिंग है अनुप्रयोग स्पष्ट रूप से यह समस्या उत्पन्न करने के लिए संदेश प्राप्त करने के लिए नहीं है। फ़ंक्शन निम्न में से कोई भी कॉल करने या संदेश पुनर्प्राप्ति लूप है किसी भी संदेश संसाधित कर रहा है, स्क्रॉल करते समय, खो करने के लिए WM_LBUTTONUP हो सकती हैं। आनंद इस श्रेणी में निम्नलिखित फ़ंक्शन:

DialogBox()
DialogBoxIndirect()
DialogBoxIndirectParam()
DialogBoxParam()
GetMessage()
MessageBox()
PeekMessage()

समाधान


समय Scrolling, WM_LBUTTONUP संदेश क्यू से आंतरिक एक स्क्रॉल पट्टी के अलावा किसी भी संदेश पुनर्प्राप्ति लूप द्वारा पुनर्प्राप्त नहीं किया जा चाहिए।


कोई अनुप्रयोग इस समस्या में निम्नानुसार आ सकते हैं:

  • एक अनुप्रयोग, उदाहरण के लिए, एक समय लेने वाली पेंट करते समय प्रक्रिया पृष्ठभूमि पृष्ठभूमि संसाधन को कार्यान्वित करने के लिए कोई संदेश पुनर्प्राप्ति लूप कार्यान्वित करता है।
  • कोई अनुप्रयोग किसी अन्य अनुप्रयोग या DLL के साथ संचार को कार्यान्वित करने के लिए कोई संदेश पुनर्प्राप्ति लूप कार्यान्वित करता है। उदाहरण के लिए, स्क्रॉल करने के लिए, अनुप्रयोग कहीं और से डेटा प्राप्त करने के लिए की आवश्यकता है।

संभावित वर्कअराउंड

दो संभावित वर्कअराउंड के नीचे सूचीबद्ध हैं। पहले तरीके से बाहर निकलने से कई अनुप्रयोगों और Windows द्वारा उपयोग किया जाता है; फिर भी, दुर्लभ परिस्थितियों के तहत पहले वैकल्पिक हल एक feasible नहीं हो सकता। इस स्थिति में, दूसरे वैकल्पिक हल का उपयोग किया हो सकता है। हालाँकि, यदि संभव हो तो, कृपया स्क्रॉलिंग समय पूरी तरह से संदेश पुनर्प्राप्ति को कार्यान्वित करने से बचने के लिए प्रयास करें।

  • टाइमर-संदेश-आधारित संसाधन का उपयोग करें। जटिल प्रक्रिया छोटे कार्यों में विराम और जहाँ प्रत्येक कार्य प्रारंभ और समाप्त होता है, तब कर कोई टाइमर संदेश पर आधारित, हर कार्य का ट्रैक रखें। टाइमर संसाधन के सभी घटक पूर्ण होने पर, हटाएँ। इस तरीके का एक उदाहरण के लिए नीचे देखें।
  • एक संदेश पुनर्प्राप्ति लूप को कार्यान्वित, लेकिन सुनिश्चित करें कि WM_LBUTTONUP से इसे प्राप्त नहीं है। यह फ़िल्टर का उपयोग करके इसे पूरा किया जाता हो सकते हैं। इस तरीके के कुछ उदाहरण के लिए नीचे देखें।

वर्क अराउंड 1 demonstrating उदाहरण

कोई अनुप्रयोग एक पेंट जटिल प्रक्रिया है। स्क्रॉल करने के लिए, ScrollWindow(), कॉल पेंट संदेश जनरेट करता है। पृष्ठभूमि संसाधन की मरम्मत करते समय किया जाता है।

  1. जब आप WM_PAINT संदेश न निम्न प्राप्त होता है:


    1. BeginPaint() को कॉल करें।
    2. Invalidated rect करने के लिए चरण 2 में उपयोग किया जा करने के लिए एक वैश्विक rect चर (उदाहरण के लिए, grcPaint) की प्रतिलिपि बनाएँ। वैश्विक rect grcPaint पहले obtained rect (grcPaint) और नया invalidated rect (ps.rcPaint) का एक संघ हो सकता है। इस के लिए कोड निम्न सदृश होगी:
               RECT grcPaint;    // Should be initialized before getting the
      // first paint message.
      :
      :
      UnionRect(&grcPaint, &ps.rcPaint,&grcPaint);
    3. ValidateRect() के साथ ps.rcPaint कॉल करें।
    4. EndPaint() को कॉल करें।
    5. एक टाइमर सेट करें।
    इस तरह, कोई अधिक WM_PAINT संदेश, उत्पन्न होते हैं, क्योंकि कोई अमान्य क्षेत्र नहीं हैं, और एक टाइमर जो WM_TIMER संदेश जनरेट करें, करेगा सेट किया गया है।
  2. WM_TIMER संदेश प्राप्त करने पर, rect वैश्विक चर की जाँच करें; यह रिक्त नहीं है, तो अनुभाग ले और इसे पेंट। उसके बाद इसे अब painted क्षेत्र शामिल होते हैं, इसलिए rect वैश्विक चर समायोजित करें।
  3. एक बार जब rect वैश्विक चर रिक्त है फिर टाइमर हटाएँ।

समाधान 2 demonstrating उदाहरण

किसी अनुप्रयोग से अन्य अनुप्रयोग जो उसके बाद विंडो में प्रदर्शित किया जाता है, या कुछ अन्य प्रणाली DDE के माध्यम से कुछ डेटा प्राप्त करने के लिए आवश्यक है। स्क्रॉल करने के लिए अनुरोध करें, और उसके बाद एक सर्वर अनुप्रयोग से डेटा प्राप्त करने के लिए अनुप्रयोग की आवश्यकता है।


तीन अन्य फ़िल्टर जो एक PeekMessage() को सेट करें और जानकारी प्राप्त करने के लिए उपयोग किया जा सकता है। फ़िल्टर के PeekMessage() uFilterFirst और uFilterLast पैरामीटर का उपयोग कर सेट किया जा सकता। uFilterFirst fist संदेश श्रेणी में जाँच करने के लिए निर्दिष्ट करता है और uFilterLast जाँच करने के लिए श्रेणी में अंतिम संदेश निर्दिष्ट करता है।
  1. जाँच करें और आवश्यक डेटा प्राप्त करने के लिए केवल संबंधित संदेश पुन: प्राप्त।
  2. WM_LBUTTONUP के लिए प्रपत्र निकाले बिना पंक्ति की जाँच करें; वह क्यू में है, तो भंग। अन्यथा, प्राप्त करना और सभी संदेश भेजें।
  3. सभी संदेश कम से WM_LBUTTONUP और WM_LBUTTONUP से अधिक प्राप्त है, लेकिन WM_LBUTTONUP प्राप्त नहीं है।

अधिक जानकारी


समस्या को पुन: उत्पन्न करने के लिए चरण

WM_LBUTTONUP संदेश की हानि करने के लिए अग्रणी घटनाओं के अनुक्रम निम्न है:

  1. स्क्रॉल पट्टी का उपयोग कर माउस क्लिक करें।
  2. चरण 1 एक WM_NCLBUTTONDOWN संदेश जनरेट करता है।
  3. चरण 2 को प्रारंभ किया जा करने के लिए कोई Windows आंतरिक संदेश लूप होती है। यह संदेश लूप के लिए स्क्रॉल पट्टी-संबंधित संदेश दिखाई देता है। यह संदेश लूप का उद्देश्य उपयुक्त WM_HSCROLL या WM_VSCROLL संदेश जनरेट करने के लिए है। संदेश लूप और स्क्रॉलिंग समाप्त होने WM_LBUTTONUP प्राप्त होने के बाद।
  4. या WM_VSCROLL WM_HSCROLL संदेश प्राप्त करते हैं, अनुप्रयोग या तो सीधे संदेश पुनर्प्राप्ति लूप में मिलती है या परिणाम का संदेश लाने में फ़ंक्शन को कॉल।
  5. चरण 4 में वर्णित संदेश लूप द्वारा WM_LBUTTONUP को क्यू से निकाल दिया जाएगा। उसके बाद WM_LBUTTONUP भेजा गया है।
  6. As result of चरण 5 WM_LBUTTONUP संदेश कहीं भी भेजा गया है और आंतरिक संदेश पुनर्प्राप्ति लूप चरण 3 में वर्णित, कभी भी इसे प्राप्त करता है। चरण 3 में संदेश लूप स्क्रॉलिंग को रोकने के लिए WM_LBUTTONUP के लिए खोज रहा है। इसे प्राप्त नहीं है, क्योंकि स्क्रॉल पट्टी में स्क्रॉल बनी रहती है।