2010-09-23 15 views
6

पर नियंत्रण को स्थानांतरित करने की अनुमति कैसे दें मेरे पास एक Winform है जिस पर मैं उपयोगकर्ता को नियंत्रण स्थानांतरित करने की अनुमति देना चाहता हूं।उपयोगकर्ता को

नियंत्रण (अब के लिए) एक खड़ी रेखा है: और सीमा के साथ लेबल की 1.

चौड़ाई संदर्भ बहुत ही महत्वपूर्ण नहीं है, लेकिन मैं वैसे भी आप को दे देंगे। मेरे पास कुछ ग्राफिक्स के साथ पृष्ठभूमि है और मैं चाहता हूं कि उपयोगकर्ता ग्राफिक्स के ऊपर दिशानिर्देश स्लाइड करने में सक्षम हो। ग्राफिक्स NPlots पुस्तकालय के साथ बना रहे हैं। ऐसा कुछ दिखता है: http://www.ibme.de/pictures/xtm-window-graphic-ramp-signals.png

यदि मैं यह पता लगा सकता हूं कि उपयोगकर्ता स्क्रीन के चारों ओर लेबल/लाइन नियंत्रण को कैसे क्लिक और खींच सकता है, तो मैं अपनी दिशानिर्देश समस्या को हल कर सकता हूं। कृपया मदद करे।

उत्तर

8

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

public void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button != MouseButton.Left) 
     return; 

    // Might want to pad these values a bit if the line is only 1px, 
    // might be hard for the user to hit directly 
    if(e.Y == myControl.Top) 
    { 
     if(e.X >= myControl.Left && e.X <= myControl.Left + myControl.Width) 
     { 
      _capturingMoves = true; 
      return; 
     } 
    } 

    _capturingMoves = false; 
} 

public void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(!_capturingMoves) 
     return; 

    // Calculate the delta's and move the line here 
} 

public void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if(_capturingMoves) 
    { 
     _capturingMoves = false; 
     // Do any final placement 
    } 
} 
+0

धन्यवाद! अच्छी तरह से काम। – Roast

3

WinForms में, आप नियंत्रण के माउसडाउन, माउसमोव और माउसअप ईवेंट को संभाल सकते हैं। माउसडाउन पर, कुछ फॉर्म या संदर्भ सेट करें जो आपके फॉर्म को बता रहा है कि माउस पर किस नियंत्रण पर क्लिक किया गया था, और MouseEventArgs से माउस के एक्स और वाई को कैप्चर करें। MouseMove पर, यदि कोई नियंत्रण सेट किया गया है, तो अपने अंतिम कब्जे वाले एक्स और वाई और वर्तमान निर्देशांक के बीच के अंतर से अपने एक्स और वाई को समायोजित करें। माउसअप पर, नियंत्रण जारी करें।

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

2

मैंने बिल्कुल ऐसा करने के लिए एक घटक लिखा था: एक फॉर्म पर नियंत्रण ले जाएं (या स्क्रीन पर एक सीमा रहित रूप ले जाएं)। आप इसे किसी भी कोड के बिना डिजाइनर से भी इस्तेमाल कर सकते हैं।

http://www.thomaslevesque.com/2009/05/06/windows-forms-automatically-drag-and-drop-controls-dragmove/

0

यहाँ एक विस्तार विधि कि आप किसी भी नियंत्रण के लिए उपयोग कर सकते हैं। यह Rx का उपयोग करता है और A Brief Introduction to the Reactive Extensions for .NET, Rx पोस्ट और वेस डायर द्वारा नमूना पर आधारित है।

public static class FormExtensions 
{ 
    public static void EnableDragging(this Control c) 
    { 
     // Long way, but strongly typed.   
     var downs = 
      from down in Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
       eh => new MouseEventHandler(eh), 
       eh => c.MouseDown += eh, 
       eh => c.MouseDown -= eh) 
      select new { down.EventArgs.X, down.EventArgs.Y }; 

     // Short way.   
     var moves = from move in Observable.FromEvent<MouseEventArgs>(c, "MouseMove") 
        select new { move.EventArgs.X, move.EventArgs.Y }; 

     var ups = Observable.FromEvent<MouseEventArgs>(c, "MouseUp"); 

     var drags = from down in downs 
        from move in moves.TakeUntil(ups) 
        select new Point { X = move.X - down.X, Y = move.Y - down.Y }; 

     drags.Subscribe(drag => c.SetBounds(c.Location.X + drag.X, c.Location.Y + drag.Y, 0, 0, BoundsSpecified.Location)); 
    } 
} 

उपयोग:

बटन Button1 = नया बटन();

बटन 1। सक्षम ड्रैगिंग();

0

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

सुनिश्चित करें कि ये ईवेंट आपके नियंत्रण ईवेंट हैं, न कि आपके फॉर्म इवेंट।

if (e.button == MouseButtons.left) 
    //this is where you set the boolean to true 

फिर अपने माउस पर अपने माउस की घटना

if (isMouseClicked == true) 
    //You then set your location of your control. See below: 
    Button1.Location = new Point(MousePosition.X, MousePosition.Y); 

करने के लिए जाने के लिए अपने isMouseClickedfalse को तैयार करना न भूलें,

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