2013-02-04 10 views
10

मेरे पास एक कस्टम नियंत्रण है जो अनिवार्य रूप से एक ड्राइंग कैनवास है, और एक प्रोग्राम जो फ़ाइलों को संपादित करने के लिए इसका उपयोग करता है। जब एक नई फाइल खोली जाती है, हालांकि, कुछ बहुत अजीब हो सकता है।मैं ओपन फ़ाइल संवाद पर डबल-क्लिक को इसके तहत फॉर्म पर क्लिक करने से कैसे रोकूं?

उपयोगकर्ता के बजाय एक आइटम का चयन करके और ENTER मारने की फ़ाइल खोलें संवाद में फ़ाइल पर डबल क्लिक (मानक TOpenDialog नियंत्रण), कैनवास के नीचे एक क्लिक करें घटना पंजीकृत करता है और की स्थिति पर एक ड्रॉ क्रिया निष्पादित करते समाप्त होता है तो लोड होने के तुरंत बाद कर्सर पूरा हो गया है।

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

क्या कोई रास्ता है जिससे मैं यह रोक सकता हूं? मैं अपना कोड "लोड होने के बाद, बस अगला क्लिक खा सकता हूं," क्योंकि यह इसके बजाय 'ENTER' कुंजी के साथ खोला जा सकता था, और फिर यह पहला वैध क्लिक याद करेगा। क्या कोई इसे संभालने के बेहतर तरीके के बारे में सोच सकता है? (विंडोज 7 का उपयोग करके, यदि यह कोई फर्क पड़ता है।)

+0

मैं के चेहरे पर एक बड़ी मुस्कान डाल दिया है अनुमान है कि आप दोनों संवाद, एक्सपी वन और Vista एक के लिए समाधान चाहते हैं। –

+1

एक नमूना नमूना जो डुप्लिकेट करता है? एक खाली परियोजना के साथ एक फॉर्म पर एक क्लिक पंजीकृत नहीं है। –

+0

मैं इसे लगातार विंडोज 7 पर देखता हूं। (शायद यह अलग-अलग ओएस के लिए अलग है?) –

उत्तर

7

यदि कोई "दूसरा क्लिक संदेश" है, तो कुछ गड़बड़ है। (एक बात के लिए, विंडोज़ में "क्लिक" संदेश नहीं हैं, बस माउस-अप और माउस-डाउन संदेश हैं।) A double click goes like this: माउस डाउन, माउस अप, डबल क्लिक, माउस अप। संवाद डबल-क्लिक संदेश और दूसरा माउस-अप संदेश के बीच गायब हो जाता है। यदि आपका नियंत्रण माउस-अप संदेश प्राप्त करता है और इसे पूर्ण क्लिक के रूप में मानता है, तो यह समस्या बताता है और आपको रोकने की आवश्यकता है; एक क्लिक हमेशा माउस-डाउन और माउस-अप संदेशों की जोड़ी है। यदि आप दोनों को नहीं मिला है, तो यह एक क्लिक नहीं है।

+0

समस्या यह है कि नियंत्रण वास्तव में एक क्लिक के बजाय माउस-अप पकड़ रहा है (मेरा मतलब है, जैसे कि यह * सेट * है उत्तरार्द्ध के बजाय पूर्व को पकड़ने के लिए)। –

+0

सही! हां, मैंने विधि पर एक ध्वज का उपयोग करके हल किया है कि डाउन इवेंट आग। नीचे गतिविधि सक्रिय है तभी picturebox वास्तव में cliccked है: निजी शून्य pictureBox1_MouseD (वस्तु प्रेषक, MouseEventArgs ई) { picturebox_sel_clicked = true कंसोल। राइटलाइन ("डी"); } – elle0087

1

वास्तव में, यह दूसरा माउस-अप ईवेंट चित्र बॉक्स पर निकाल दिया गया है, जो इवेंट हैंडलर आमंत्रण की ओर जाता है। यह एक ओपनफाइलडियलॉग बग लगता है। माउस अप ईवेंट के लिए IsMouseCaptured के लिए चेक जोड़ने की आवश्यकता है, केवल एक माउस ऊपर की बजाय माउस एक माउस नीचे और माउस ऊपर है।

1

मैं इसे इस तरह से (यह निश्चित रूप से एक काम के आसपास) हल:

CFileDialog my_file_dialog(...); 
    if (my_file_dialog.DoModal()!=IDOK) 
     return; 

    CString fileName= my_file_dialog.GetPathName(); 

    //... 

    CSelectItemsDlg dlg; 


    // Avoid that the double-click on the CFileDialog sends the WM_LBUTTONUP message to the next window causing the Unselect of an item that is under the mouse cursor. 
    // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10287063.html#a2476475 
    MSG msg; 
    while(PeekMessage(&msg,0,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE)); 

    int DoModalRes = dlg.DoModal(); 

और आप विश्वास कर सकते हैं कि मैं अपने मालिक :)

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