2013-03-10 10 views
8

मेरे पास form_MouseDown ईवेंट पर एक ड्रैग() विधि है। मेरे पास फॉर्म पर एक क्लिक इवेंट भी है। समस्या यह है कि यदि मैं फॉर्म पर क्लिक करता हूं, तो माउसडाउन ईवेंट ट्रिगर हो जाता है और इसे कभी भी क्लिक ईवेंट ट्रिगर करने का मौका नहीं मिलता है।माउसडाउन और संघर्ष पर क्लिक करें

इस समस्या को हल करने का सबसे अच्छा तरीका क्या है? मैं वास्तव में खींच लिया गया है, तो पिक्सल गिनती सोच रहा था, लेकिन एक बेहतर तरीका होना चाहिए। कोई सुझाव?

+0

"पिक्सल गिनती" काफी आम है, क्योंकि ज्यादातर मामलों में आप वास्तव में ** नहीं चाहिए ** खींचें बंद आग जब 'आंदोलन दूरी' उदाहरण के लिए, 7..15 पिक्सेल से छोटा है। यहां तक ​​कि विंडोज़ डेस्कटॉप में भी कुछ पिक्सेल थ्रेसहोल्ड है। – quetzalcoatl

+2

'क्लिक करें' का उपयोग न करें, और इसके बजाए 'माउसअप' का उपयोग करें? – Neolisk

+0

मैंने एक डेमो बनाया और मुझे यह व्यवहार नहीं मिल रहा है। माउसडाउन क्लिक के बाद पहुंच गया है। क्या आप कुछ कोड पोस्ट कर सकते हैं? –

उत्तर

2

मैं पिक्सल गिनती करता है, तो प्रपत्र वास्तव में है सोच रहा था खींचा गया, लेकिन एक बेहतर तरीका होना चाहिए।

नहीं, यह ठीक है कि आपको यह कैसे करना है।

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

उनमें से दोनों ऑब्जेक्ट पर नीचे जाने वाले माउस बटन से शुरू होते हैं, लेकिन उनमें से एक माउस बटन के साथ उसी स्थिति में बैक अप लेने के साथ समाप्त होता है और दूसरा माउस बटन के साथ समाप्त होता है एक पूरी तरह से अलग स्थिति।

के बाद से समय मशीनों अभी तक सिद्ध नहीं किया गया है, यदि आप पहले से यह जानने का कोई तरीका नहीं है।

तो हाँ, आपको किसी प्रकार की दूरी सीमा को बनाए रखने की आवश्यकता है, और अगर ऑब्जेक्ट पर डाउन होने पर पॉइंटर उस दूरी सीमा के बाहर चलता है, तो आप इसे ड्रैग मानते हैं। अन्यथा, आप इसे एक क्लिक मानते हैं।

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

बेशक

, आप वास्तव में इस बारे में कोई चिंता या खुद खींचें सीमा की गणना करने की जरूरत नहीं है।इसके बजाय, GetSystemMetrics फ़ंक्शन को कॉल और या तो SM_CXDRAG या SM_CYDRAG निर्दिष्ट करने के द्वारा, विंडोज डिफ़ॉल्ट मान का उपयोग प्राप्य। (ये WinForms ढांचे द्वारा कहीं से अवगत कराया जा सकता है, लेकिन मैं ऐसा नहीं सोचता। यह सिर्फ पी के रूप में आसान है/उन्हें अपने आह्वान।)

const int SM_CXDRAG = 68; 
const int SM_CYDRAG = 69; 
[DllImport("user32.dll")] 
static extern int GetSystemMetrics(int index); 

Point GetDragThreshold() 
{ 
    return new Point(GetSystemMetrics(SM_CXDRAG), GetSystemMetrics(SM_CYDRAG)); 
} 
+0

जबकि आपके यहां कुल मिलाकर अच्छे अंक हैं, कार्यक्रम को इस तरह से डिजाइन किया जाना चाहिए कि पक्ष में कुछ भी 5px खींचें और छोड़ना कुछ भी नहीं होने का कारण बनता है। अन्यथा आप कभी नहीं जानते, शायद 5 पीएक्स शेक कुछ लोगों के लिए क्लिक करने के लिए पर्याप्त नहीं है, और उन्हें 10px की आवश्यकता है। उचित कार्यान्वयन के साथ, माउस आंदोलन अप्रासंगिक है। उदाहरण के लिए, यदि आप फ़ाइल को विंडोज़ में खुद को छोड़कर छोड़ देते हैं, तो कुछ भी नहीं होता है। – Neolisk

+0

कल्पना कीजिए कि आप WinForms डिजाइनर बना रहे हैं। यहां तक ​​कि अगर सही ढंग से लागू किया गया है, तो माउस आंदोलन अभी भी प्रासंगिक है। यह विंडोज एक्सप्लोरर की तुलना में एक पूरी तरह से अलग डिज़ाइन है जहां इसे अपने आप आइकन को छोड़ने का कोई अर्थ नहीं है। लेकिन आप निश्चित रूप से कुछ पिक्सल को किसी भी दिशा में नियंत्रण खींच सकते हैं। या एक फोटो संपादक में एक चयन। या किसी अन्य मामले में जहां "उचित कार्यान्वयन" नियम काम नहीं करेगा। –

+0

उन मामलों में आप कीबोर्ड पोजिशनिंग (तीर कुंजी) का उपयोग करेंगे। यह ठीक है - निर्दिष्ट पिक्सेल में 1 पिक्सेल से आगे बढ़ें। अन्यथा आप चाहते हैं, उदाहरण के लिए वीएस में, नियंत्रण ग्रिड, या अन्य नियंत्रणों के लिए चिपकने के लिए नियंत्रण। दोनों मामलों में, वीएस आपको स्थिति के साथ सहायता करेगा। फ़ोटोशॉप या पेंट में आप 1) तीर कुंजी या 2 का उपयोग कर सकते हैं) क्या यह किसी भी दिशा में कई पिक्सेल द्वारा स्थानांतरित होने पर बिंदु पर ज़ूम किया गया है, अप्रासंगिक हो जाता है। – Neolisk

2

Unfortunatelly, जब "बटन-है दबाया" समय के बिंदु पर आप अभी तक पता नहीं अगर वांछित कार्रवाई बस एक क्लिक या ड्रैग-बूंद है। आप इसे बाद में देखेंगे।

एक क्लिक के लिए, निर्धारक "कोई आंदोलन" और "अप" बटन है।

ड्रैग के लिए, निर्धारक "आंदोलन" और "बटन अप" होता है।

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

उन घटनाओं इसलिए एक अच्छी जगह शुरू/Mouse.Capture तंत्र को रोकने के (गतिशील वर्तमान खींचें adorners और ड्रॉप स्थान संकेत करने के लिए), या, सरल रूप में कर रहे हैं वेक्टर और जांच करें कि दूरी क्या है> डी (भले ही आंदोलन हुआ हो, वहां कुछ सुरक्षित न्यूनतम दूरी होनी चाहिए जिसमें डीआरएजी को तोड़ दिया गया हो। माउस कभी-कभी "जगी" होता है, और लोग वास्तव में ड्रैगिंग शुरू करने के लिए अपने ऐप को पसंद नहीं करेंगे जब वे तेजी से माउस सूचक आंदोलन :)) के अंत में डबल क्लिक

2

मैं इस समाधान मिल गया है, हालांकि यह एक डबल के लिए है क्लिक करें और एक माउस नीचे घटनाओं:

void pictureBox_MouseDown(object sender, MouseEventArgs e) 
{ 
if (e.Button == MouseButtons.Left && e.Clicks ==1) 
{ 
PictureBox pb = (PictureBox)sender; 
DoDragDrop((ImageData)pb.Tag, DragDropEffects.Copy); 
} 
} 

स्रोत: http://code.rawlinson.us/2007/04/c-dragdrop-and-doubleclick.html

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