2009-06-26 9 views
5

मैं रन-टाइम पर एक भरे गोलाकार आयत बनाना चाहता हूं और इसे विंडोज फॉर्म में एक पिक्चरबॉक्स (पहले से बनाया और छुपा) की सामग्री के रूप में असाइन करना चाहता हूं।वीबी.NET/C# के साथ विंडोज फॉर्म में रनटाइम पर गोलाकार आयत कैसे बनाएं?

क्या आपको पता है कि मैं इसे कैसे कार्यान्वित कर सकता हूं?

उत्तर

8

इस विधि एक ग्राफिक्स वस्तु (VB कोड) पर एक गोलाकार आयत भर देता है:

Public Sub FillRoundedRectangle(ByVal g As Drawing.Graphics, ByVal r As Rectangle, ByVal d As Integer, ByVal b As Brush) 
    Dim mode As Drawing2D.SmoothingMode = g.SmoothingMode 
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed 
    g.FillPie(b, r.X, r.Y, d, d, 180, 90) 
    g.FillPie(b, r.X + r.Width - d, r.Y, d, d, 270, 90) 
    g.FillPie(b, r.X, r.Y + r.Height - d, d, d, 90, 90) 
    g.FillPie(b, r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90) 
    g.FillRectangle(b, CInt(r.X + d/2), r.Y, r.Width - d, CInt(d/2)) 
    g.FillRectangle(b, r.X, CInt(r.Y + d/2), r.Width, CInt(r.Height - d)) 
    g.FillRectangle(b, CInt(r.X + d/2), CInt(r.Y + r.Height - d/2), CInt(r.Width - d), CInt(d/2)) 
    g.SmoothingMode = mode 
End Sub 

इस फ़ंक्शन को कॉल करें, picturebox का रंग घटना को संभालने और पारित e.Graphics पहले तर्क के रूप में आपत्ति करने के लिए, और अगर आप आयत को अपने चित्र बॉक्स को भरने के लिए चाहते हैं तो दूसरे तर्क के रूप में पिक्चरबॉक्स की सीमाएं।

घ पैरामीटर कोनों 'कोण बदल जाता है, मैं 30 के एक मूल्य से कॉल करने के लिए, आप विभिन्न मूल्यों की कोशिश कर सकते हैं ...

इसके अलावा, यहां (भरने के बजाय) आकर्षित करने के लिए एक गोलाकार आयत कुछ कोड है:

Public Sub DrawRoundedRectangle(ByVal g As Drawing.Graphics, ByVal r As Rectangle, ByVal d As Integer, ByVal p As Pen) 
    g.DrawArc(p, r.X, r.Y, d, d, 180, 90) 
    g.DrawLine(p, CInt(r.X + d/2), r.Y, CInt(r.X + r.Width - d/2), r.Y) 
    g.DrawArc(p, r.X + r.Width - d, r.Y, d, d, 270, 90) 
    g.DrawLine(p, r.X, CInt(r.Y + d/2), r.X, CInt(r.Y + r.Height - d/2)) 
    g.DrawLine(p, CInt(r.X + r.Width), CInt(r.Y + d/2), CInt(r.X + r.Width), CInt(r.Y + r.Height - d/2)) 
    g.DrawLine(p, CInt(r.X + d/2), CInt(r.Y + r.Height), CInt(r.X + r.Width - d/2), CInt(r.Y + r.Height)) 
    g.DrawArc(p, r.X, r.Y + r.Height - d, d, d, 90, 90) 
    g.DrawArc(p, r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90) 
End Sub 
+0

हे मेटा -क्राइट आपके बिजली के लिए बहुत कुछ धन्यवाद! : डी कोड बहुत अच्छी तरह से काम कर रहा है। बस एक और सवाल, अगर मैं इसे तुरंत पेंट नहीं करना चाहता हूं तो मैं कैसे कर सकता हूं, लेकिन केवल तभी जब कोई निश्चित स्थिति में हो? क्या मुझे इस मामले में पेंट इवेंट का भी उपयोग करना चाहिए? – Drake

+0

आप अपनी कक्षा में एक बूलियन वैल्यू प्राप्त कर सकते हैं (मान लीजिए कि इसे मस्तपेंट कहा जाता है) जिसे आप आयत को पेंट करने के लिए सेट करते हैं, तो आप पेंट इवेंट में एक शर्त जोड़ सकते हैं: यदि आवश्यक हो तो [पेंट गोलाकार आयताकार] अंत यदि –

+0

ठीक है, तो मैं इसे आज़माउंगा, धन्यवाद – Drake

0

ऐसा करने का सबसे आसान तरीका ग्राफिक्स ऑब्जेक्ट का उपयोग करके फ्लाई पर बिटमैप बनाना है। DrawEllipse विधि पर्याप्त होना चाहिए।

फिर उस बिटमैप को पिक्चरबॉक्स ऑब्जेक्ट की सामग्री के रूप में असाइन करें।

13

उत्तर समाधान के रूप में चिह्नित भरे समाधान के साथ समस्या यह है कि यह गैर ठोस/वर्दी ब्रश के साथ अच्छी तरह से काम नहीं करता है। यहाँ GraphicsPath वर्ग जो मुझे लगता है कि के आधार पर एक दूसरे से अधिक पुन: प्रयोज्य है:

public static void FillRoundedRectangle(Graphics graphics, Rectangle rectangle, Brush brush, int radius) 
{ 
    if (graphics == null) 
     throw new ArgumentNullException("graphics"); 

    SmoothingMode mode = graphics.SmoothingMode; 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 

    using (GraphicsPath path = RoundedRectangle(rectangle, radius)) 
    { 
     graphics.FillPath(brush, path); 
    } 
    graphics.SmoothingMode = mode; 
} 

public static GraphicsPath RoundedRectangle(Rectangle r, int radius) 
{ 
    GraphicsPath path = new GraphicsPath(); 
    int d = radius * 2; 

    path.AddLine(r.Left + d, r.Top, r.Right - d, r.Top); 
    path.AddArc(Rectangle.FromLTRB(r.Right - d, r.Top, r.Right, r.Top + d), -90, 90); 
    path.AddLine(r.Right, r.Top + d, r.Right, r.Bottom - d); 
    path.AddArc(Rectangle.FromLTRB(r.Right - d, r.Bottom - d, r.Right, r.Bottom), 0, 90); 
    path.AddLine(r.Right - d, r.Bottom, r.Left + d, r.Bottom); 
    path.AddArc(Rectangle.FromLTRB(r.Left, r.Bottom - d, r.Left + d, r.Bottom), 90, 90); 
    path.AddLine(r.Left, r.Bottom - d, r.Left, r.Top + d); 
    path.AddArc(Rectangle.FromLTRB(r.Left, r.Top, r.Left + d, r.Top + d), 180, 90); 
    path.CloseFigure(); 
    return path; 
} 

और यहां ड्रा केवल (भर नहीं) के लिए कोड, एक ही विचार पर आधारित है:

public static void DrawRoundedRectangle(Graphics graphics, Rectangle rectangle, Pen pen, int radius) 
{ 
    if (graphics == null) 
     throw new ArgumentNullException("graphics"); 

    SmoothingMode mode = graphics.SmoothingMode; 
    graphics.SmoothingMode = SmoothingMode.AntiAlias; 

    using (GraphicsPath path = RoundedRectangle(rectangle, radius)) 
    { 
     graphics.DrawPath(pen, path); 
    } 
    graphics.SmoothingMode = mode; 
} 
संबंधित मुद्दे