2010-03-27 15 views
10

क्या मैं माउसक्लिक के साथ एक आयताकार खींच सकता हूं? मेरा कोड अब तक काम नहीं कर रहा है। क्या आप मेरी मदद कर सकते हैं?माउस पर एक आयत खींचें

private void panel1_MouseClick(object sender, MouseEventArgs e) 
{ 
    Graphics g = this.CreateGraphics(); 
    Pen pen = new Pen(Color.Black, 2); 

    g.DrawRectangle(pen, 100,100, 100, 200); 
} 
+5

कोशिश " this.CreateGraphics(); " "this.panel1.CreateGraphics();" – Nagg

+1

@Nagg - आपका समाधान गलत है क्योंकि जब फॉर्म को चित्रित किया गया है तो आयत खो जाएगा। –

उत्तर

11

संपादित संस्करण:

तुम क्या करने की कोशिश कर रहा है की बहुत assumpition के बिना:

private void panel1_Click(object sender, EventArgs e) { 
    using (Graphics g = this.panel1.CreateGraphics()) { 
     Pen pen = new Pen(Color.Black, 2); 
     Brush brush = new SolidBrush(this.panel1.BackgroundColor); 

     g.DrawRectangle(pen, 100,100, 100, 200); 

     pen.Dispose(); 
    } 
} 

आपका कोड काम नहीं करता क्योंकि यह विंडो (आय) पर आयताकार खींच रहा है और खींचा आयताकार तब आपके पैनल द्वारा छुपाया जाता है।

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

संपादित 2

अपने आयत एक ही स्थान पर हमेशा तैयार किया जाएगा के रूप में आप पृष्ठभूमि स्पष्ट करने की जरूरत नहीं है। आदेश बिंदु है जहां उपयोगकर्ता cliced ​​पर आयत बनाने के लिए में आप घटना माउस नीचे, जैसे करने के लिए कोड बढ़ना चाहिए (यह एक धारणा यह है कि क्या आप चाहते हैं है): को बदलने के लिए

private void panel1_MouseDown(object sender, MouseEventArgs e) { 
    using (Graphics g = this.panel1.CreateGraphics()) { 
     Pen pen = new Pen(Color.Black, 2); 
     Brush brush = new SolidBrush(this.panel1.BackColor); 

     g.FillRectangle(brush, this.panel1.Bounds); // redraws background 
     g.DrawRectangle(pen, e.X, e.Y, 20, 20); 

     pen.Dispose(); 
     brush.Dispose(); 
    } 
} 
+0

@ ओबेलिक्स - आपका समाधान गलत है। '1.) 'आप या तो पेन या ग्राफिक्स ऑब्जेक्ट्स का निपटान नहीं करते हैं जो आप बनाते हैं। '2.) 'जब फॉर्म को चित्रित किया गया है आयत खो गया है। –

+2

@roygbiv: ओपी के बाद समाधान गलत नहीं है (मेरी पहली पंक्ति देखें)। समाधान अनुकूल है ... अच्छा यह मूल लेखक की आवश्यकताओं पर निर्भर करता है। 1. के लिए) आप सही हैं, वस्तुओं का निपटान किया जाना चाहिए। 2. के लिए) आप भी सही हैं ... लेकिन क्या यह एक आवश्यकता है कि आयताकार मौजूद रहे? ओपी में देख सकते हैं। – AxelEckenberger

+0

धन्यवाद। हाँ आपका जवाब मेरे लिए काम कर रहा है। इसके बाद मैं पिछले आयत को गायब करना चाहता हूं जो माउस क्लिक करने के बाद खींचा गया है जब मैंने दोबारा क्लिक किया। मैं यह कैसे कर सकता हूं? – Dinu

0

आपको इसे नियंत्रण के "पेंट" घटना (इस मामले में पैनल 1) में आकर्षित करना चाहिए।

3

एक PictureBox बजाय के साथ इस कोड का प्रयास करें (आप सिर्फ पाने के लिए शुरू कर दिया - वहाँ ऐसा करने के कई अलग अलग तरीके हैं):

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (pictureBox1.Image == null) 
    { 
      pictureBox1.Image = new Bitmap(pictureBox1.width, 
        pictureBox1.height); 
    } 
    using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
    { 
     // draw black background 
     g.Clear(Color.Black); 
     Rectangle rect = new Rectangle(100, 100, 200, 200); 
     g.DrawRectangle(Pens.Red, rect); 
    } 
    pictureBox1.Invalidate(); 
} 

इस तकनीक को स्वचालित रूप से अपने ड्राइंग "जारी रहती है", जिसका अर्थ है कि यह जीत लिया ' अगर गायब हो जाता है तो एक और खिड़कियां गायब हो जाती हैं। जब आप सीधे नियंत्रण में आकर्षित होते हैं (आप CreateGraphics() कॉल के साथ क्या करने का प्रयास कर रहे हैं) तो आप आमतौर पर गैर-दृढ़ता की समस्या में भाग लेते हैं।

अद्यतन:

how to draw drawings in picture box

1

मैं माउस क्लिक के साथ एक आयत बनाएं सकता है: यहां जहां माउस क्लिक किया जाता है के जवाब में कुछ ड्राइंग के एक अधिक विस्तृत उदाहरण के साथ एक और जवाब है?

यदि आप मतलब है "माउस मेरी पैनल पर क्लिक किया जाता है जब मैं एक आयत प्रदर्शित करना चाहते हैं" तो आप है कि इस तरह कर सकते हैं:

 private bool displayRectangle = false; 

     private void panel1_MouseClick(object sender, MouseEventArgs e) 
     { 
      displayRectangle = true; 
      panel1.Invalidate(false); 
     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 
      if (displayRectangle) 
      { 
       using (Pen p = new Pen(Color.Black, 2)) 
       { 
        e.Graphics.DrawRectangle(p, 100, 100, 100, 200); 
       } 
      } 
     } 

यदि आप मतलब है "मैं खींचें करना चाहते हैं आयताकार बनाने के लिए मेरे पैनल पर माउस "तो आपके पास थोड़ा और काम है।

आपको माउस डाउन पॉइंट और वर्तमान स्थिति के बीच डेल्टा को ट्रैक करने वाली घटनाओं को माउस ऊपर, स्थानांतरित करने और नीचे करने की आवश्यकता है। अंत में, माउस पर, आप अपना आयत खींचेंगे। यह अधिक जटिल हो जाता है क्योंकि आपको "ड्रैग" आयत खींचने के लिए डबल बफरिंग या 'xor' आयत का उपयोग करने की आवश्यकता होती है।

इन दो धागे मदद मिल सकती है:

dragging picturebox inside winform on runtime

Snap to grid mouse locking up

+0

जैसा कि मैंने इसे देखा है, इस तरह के नियंत्रण पेंट इवेंट के अंदर कस्टम ग्राफिक्स को प्रस्तुत करने में मुख्य समस्या यह है कि प्रत्येक बार नियंत्रण को पुनर्निर्मित करने पर कोड को कॉल किया जाता है। केवल एक साधारण आयताकार के साथ, यह वास्तव में एक समस्या नहीं है, लेकिन जटिल ग्राफिक्स के साथ यह आसानी से एक बन सकता है। एक बार एक अलग सतह पर प्रस्तुत करने के लिए बेहतर है और फिर उस सतह से अपनी पेंट घटना में नियंत्रण में प्रतिलिपि बनाएँ (जो अनिवार्य रूप से मेरा उदाहरण क्या कर रहा है)। – MusiGenesis

+0

@MusiGenesis - इसलिए डबल बफरिंग का उपयोग करने के बारे में मेरा बिंदु। –

+0

तो आपने मेरा पूरी तरह से वैध जवाब नीचे दिया? – MusiGenesis

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