2009-12-04 10 views
5

में मोडल संवाद दोबारा खोलें मुझे एक ही कक्षा से दो बार तत्काल एक संवाद बॉक्स खोलने की आवश्यकता है। जब मैं इसेएमएफसी

CdelmeDlg dlg; 
dlg.DoModal(); 
dlg.DoModal(); 

दूसरा कॉल केवल एक विभाजित दूसरे के लिए संवाद खोलता है, तो यह बंद हो जाता है। मेरे शर्त वहाँ संदेश कतार में एक बचे हुए संदेश है था, इसलिए मैं इस कॉल

MSG msgCur; 
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE)) 
    ; 

इस समस्या का हल के बीच में जोड़ा है, लेकिन यह करने के लिए बात की गलत तरह की तरह लगता है। बचे हुए संदेश को सही तरीके से संसाधित करने का कोई तरीका है?

+0

यह बहुत अजीब लग रहा है कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? –

+0

मुझे यूआई के बिना अपना एप्लिकेशन चालू रखने की आवश्यकता है और टाइमर खत्म होने पर हर बार इस संवाद को पॉप करें। – MMx

+0

आप संवाद कैसे बंद कर रहे हैं? –

उत्तर

1

एंडडिअलॉग (आईडीओके) को कॉल न करें;

दबाए जाने वाले ठीक या रद्द बटन को संभालने के लिए केवल ऑनऑक या ऑनकैंकल प्राप्त होता है ... अन्यथा EndDialog को दो बार बुलाया जा रहा है और आपको वह समस्या मिल जाएगी जो आपको मिल रही है!

0

यदि आप चाहते हैं कि आपका एप्लिकेशन यूआई के बिना पृष्ठभूमि में चलाए, तो juz अस्थायी रूप से इसे क्यों न छिपाएं? यह एक साधारण कार्य है-> शोविंडो (SW_HIDE) आपके लिए नौकरी करेगा।

मुझे लगता है कि आपको अपने डिज़ाइन निर्णय को संशोधित करना चाहिए क्योंकि यह एक अनुप्रयोग के लिए अजीब लगता है जैसा आप चाहते थे।

1

मुझे वास्तव में लगता है कि यिनफ़ी का यहां एक अच्छा बिंदु है।

यह थोड़ी देर के बाद से मैंने एमएफसी (धन्यवाद भगवान) के साथ खेला है, लेकिन स्मृति से, टाइमर, यूआई थ्रेड से कॉल किया जा सकता है या नहीं, जिसे आप उपयोग करते हैं उसके आधार पर। यदि टाइमर मुख्य यूआई थ्रेड पर उठाया जा रहा है, तो एक मोडल डायलॉग मुख्य थ्रेड को तब तक रोक देगा जब तक इसे खारिज नहीं किया जाता है, जिसके बाद इसे अगले टाइमर द्वारा बुलाया जाएगा। यदि टाइमर को अलग थ्रेड पर उठाया जाता है, तो आपका संवाद मुख्य यूआई थ्रेड को अवरुद्ध नहीं कर रहा है क्योंकि यह एक अलग धागे पर दिखाया जा रहा है।

यह और अधिक कल्पनाशील प्रतीत होता है क्योंकि यिनिफी ने इंगित किया है कि जब भी टाइमर उठाया जाता है तो आप अपना संवाद फिर से दिखाना चाहते हैं, जब उपयोगकर्ता इसे खारिज करने के लिए बटन पर क्लिक करता है तो उसे छुपाता है। इस तरह, यदि समय फिर से उठाया जाता है, तो यह सब संवाद को दोबारा दिखाता है चाहे वह वर्तमान में खुला है या नहीं।

टाइमर और समवर्तीता के बारे में एक महान पोस्ट here (www.eggheadcafe.com) है जो आपको दिलचस्प लगेगा, और जो कुछ मैं पूरा करने में कामयाब रहा उससे चीजों को स्पष्ट कर सकता हूं।

1

क्यों आप इसे इस प्रकार कोड नहीं कर सकते हैं:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
0

मैं संवाद छुपा के बजाय इसे बंद करने और एक अन्य बात यह है कि पहले सोता है और फिर संवाद unhides शुरू करके समस्या हल हो।

0

अपने कोड लाइन है हो सकता है:

m_pMainWnd = &dlg; 

यदि हां, तो DoModal की पहली कॉल (के बाद आवेदन की तुलना में) समाप्त हो जाएगा, DoModal के अन्य सभी कॉल() वापस आ जाएगी -1। एमएसडीएन से:

माइक्रोसॉफ्ट फाउंडेशन क्लास लाइब्रेरी स्वचालित रूप से आपके धागे को समाप्त कर देगी जब m_pMainWnd द्वारा निर्दिष्ट विंडो बंद हो जाती है। यदि यह धागा किसी एप्लिकेशन के लिए प्राथमिक धागा है, तो आवेदन भी समाप्त कर दिया जाएगा।

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