2009-09-12 15 views
6

मैं देशी सी ++ के लिए नया हूं। अभी, मैंने इसे तब बनाया जब मैं बाएं माउस बटन दबाता हूं, इसमें एक लूप है जो अमान्येट्रैक करता है और एक आयताकार खींचता है, और जब भी यह पुनरावृत्त होता है तो बॉक्स आकार द्वारा एक्स को बढ़ाता है। लेकिन, सी ++ सी # की तुलना में ड्राइंग पर इतना तेज और कुशल है, यह सब तुरंत इसे खींचता है। मैं यह चाहता हूं कि आयत को अमान्य कर दें, आयत दिखाएं, 50ms प्रतीक्षा करें, फिर लूप जारी रखें। मैंने नींद की कोशिश की (50) लेकिन परिणाम दिखाने से पहले पेंटिंग करने तक यह अभी भी इंतजार कर रहा है। मैंने PeekMessage भी कोशिश की लेकिन यह कुछ भी नहीं बदला। किसी भी मदद की सराहना की जाएगी। धन्यवादसी ++ के लिए समकक्ष DoEvents?

उत्तर

16

DoEvents मूल रूप से तब्दील हो के रूप में:

void DoEvents() 
{ 
    MSG msg; 
    BOOL result; 

    while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) 
    { 
     result = ::GetMessage(&msg, NULL, 0, 0); 
     if (result == 0) // WM_QUIT 
     {     
      ::PostQuitMessage(msg.wParam); 
      break; 
     } 
     else if (result == -1) 
     { 
      // Handle errors/exit application, etc. 
     } 
     else 
     { 
      ::TranslateMessage(&msg); 
      :: DispatchMessage(&msg); 
     } 
    } 
} 
+3

+1, लगभग सही है, सिवाय इसके कि GetMessage का वापसी मूल्य चेक नहीं किया गया है और WM_QUIT सही तरीके से संभाला नहीं गया है। –

+2

यदि GetMessage वापसी 0 है, तो WM_QUIT संदेश की आवश्यकता है दोबारा पोस्ट किया जाना चाहिए (http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx)। GetMessage भी वापस आ सकता है, जिसे संभाला जाना चाहिए। –

+0

@ फिलिपनावरा मैं इसके लिए बस इसके लिए इरादा रखता था मूल बातें दिखाएं, लेकिन आप बिल्कुल सही हैं - सभी 3 संभावित मामलों को दिखाने के लिए संपादित। –

2

मैं थोड़ा Win32 एपीआई में जंग लगी हूँ, लेकिन ऐसा करने का अतुल्यकालिक तरीका होगा:

  • रेक्ट अमान्य
  • सेट एक 50ms
  • के बाद एक संदेश भेजने के लिए टाइमर (नीचे देखें) WM_PAINT ईवेंट होने के लिए ईवेंट लूप पर वापस जाएं
  • टाइमर संदेश प्राप्त करने पर, रेक्ट को ले जाएं, फिर

इस तरह से ईवेंट संचालित होने के साथ अच्छी तरह से एकीकृत करता है। मुझे एहसास है कि यह वही नहीं है जो आप पूछते हैं, लेकिन मैंने सोचा कि मैं इसे किसी भी संभावित समाधान के रूप में उल्लेख करूँगा :)

संपादित करें: एक त्वरित Google विंडोज एपीआई कॉल [सेटटाइमर] (http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx)) का उपयोग कर सकता है जिसका आप उपयोग कर सकते हैं यह सुविधा प्रदान करने के लिए। संदेश एक WM_TIMER होगा।

+0

+1, यह विशेष समस्या के लिए एक बेहतर समाधान है। –

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