2010-10-06 10 views
10

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

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

हम तुम एक डेटा ऑब्जेक्ट वाला या एक खींचें & ड्रॉप आपरेशन शुरू करने के लिए नियंत्रण का प्रतिनिधित्व करने के साथ DoDragDrop कॉल कर सकते हैं कंटेनर की DragDrop घटना संभाल तो, और नियंत्रण के लिए कदम WinForms

+1

हाँ, लेकिन आपको इसमें कड़ी मेहनत करने की आवश्यकता होगी। – SLaks

+0

@ स्लक्स: क्या आप मुझे थोड़ा सा निर्देश दे सकते हैं। मैं जितना आवश्यक हो उतना समय दे सकता हूं। मुझे इस समस्या को मेरी नौकरी में हल करने के लिए मिला लेकिन वहां हमने अपने ग्राहक को असंभव के लिए आश्वस्त किया। लेकिन मुझे पता है कि यह संभव है तो मैं इसे अपने घर पर करना चाहता हूं। कृपया मुझे बताएं कि इसके साथ कहां से शुरुआत करें। –

उत्तर

20

मैंने एक साधारण रूप बनाया है जो दर्शाता है कि नियंत्रण खींचकर नियंत्रण कैसे स्थानांतरित किया जाए। उदाहरण मानता है कि प्रासंगिक ईवेंट हैंडलर से जुड़े फॉर्म पर बटन 1 नाम का एक बटन है।

private Control activeControl; 
private Point previousLocation; 

private void button1_Click(object sender, EventArgs e) 
{ 
    var textbox = new TextBox(); 
    textbox.Location = new Point(50, 50); 
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown); 
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove); 
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp); 

    this.Controls.Add(textbox); 
} 

void textbox_MouseDown(object sender, MouseEventArgs e) 
{ 
    activeControl = sender as Control; 
    previousLocation = e.Location; 
    Cursor = Cursors.Hand; 
} 

void textbox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (activeControl == null || activeControl != sender) 
     return; 

    var location = activeControl.Location; 
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); 
    activeControl.Location = location; 
} 

void textbox_MouseUp(object sender, MouseEventArgs e) 
{ 
    activeControl = null; 
    Cursor = Cursors.Default; 
} 
+1

यह वीडियो है जिसे मैंने इस http://www.youtube.com/watch?v=itdFYe7La-Y को लागू करने के बाद बनाया है –

1

में ऐसी कार्यक्षमता मिल सकता है।

आप नियंत्रण को देखने के लिए के रूप में यह घसीटा है चाहते हैं, आप कर सकते हैं या तो एक पारदर्शी नियंत्रण (फोन DrawToBitmap) दिखा माउस के तहत (संभाल WM_NCHITTEST) रूप है, या बिल्कुल भी & बूंद का उपयोग खींचें नहीं है और इसके बजाय माउस घटनाओं को संभालने और मैन्युअल रूप से राज्य को ट्रैक करें।

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

+0

मैं पैनल और बटन नियंत्रण घटनाओं पर देख सकता हूं। उनके पास DoDragDrop घटना/संपत्ति नहीं है। क्या मुझे सही करने की अनुमति देना है। –

+0

हां; आपको कंटेनर पर 'AllowDrop' सेट करने की आवश्यकता है। 'DoDragDrop' एक विधि है जिसे माउसडाउन के तुरंत बाद माउसमोव पर कॉल करने की आवश्यकता होती है यदि माउस' SystemInformation.DragSize' के बाहर स्थानांतरित हो जाता है। – SLaks

+0

यहां उदाहरण देखें: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx – SLaks

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