2010-04-05 10 views
6

मैं कस्टम कार्यक्षमता के साथ एक कस्टम TabControl आकर्षित करने के लिए चाहते हैं।कोई दृश्य शैलियों के साथ TabRenderer सक्षम?

ऐसा करने के लिए, मैं पैनल वर्ग विरासत में मिला और OnPaint TabRenderer वर्ग के साथ आकर्षित करने के लिए विधि overrided।

समस्या यह है कि TabRenderer केवल दृश्य शैलियों को सक्षम करते समय काम कर रहा है (TabRenderer.IsSupported के साथ चेक किया जा सकता है), लेकिन दृश्य शैली अक्षम होने पर मुझे क्या करना चाहिए?

इस मामले में, मैंने दृश्य शैली के बिना टैब खींचने के लिए ControlPaint कक्षा का उपयोग करने का विचार किया, लेकिन इसमें टैब से संबंधित कोई ड्रॉ विधियां नहीं हैं। मैं मूल रूप से नियमित रूप से TabControl की तरह व्यवहार करना चाहता हूं।

+0

किस तरह से आप अपने कस्टम '' TabControl' System.Windows.Forms.TabControl' से अलग हो करना चाहते हैं? –

+0

एक टैब पर राइट क्लिक इजाजत दी एक टैब के प्रतीक के रूप में एनिमेशन की अनुमति दें, कस्टम प्रत्येक टैब पर X बटन डूब की अनुमति दें, जब टैब नियंत्रण न नियंत्रण की चौड़ाई में फ़िट स्थान और बाएं और दाएं बटन के ड्राइंग बदलने, की अनुमति मध्य माउस बटन के साथ बंद करना, टैबपेज खींचें और छोड़ना ... मैं टैब को फ़ायरफ़ॉक्स में काम करना चाहता हूं। – DxCK

उत्तर

5

आप खुद यह आकर्षित करने के लिए है, क्योंकि वहाँ इस के लिए एपीआई प्रकाशित नहीं किया गया है। उम्मीद है कि गैर-विज़ुअल स्टाइल तरीके से ऐसा करना अपेक्षाकृत आसान है।

आप ControlPaint.DrawBorder3D साथ फलक सीमा आकर्षित और बटन के लिए निम्न कोड की तरह कुछ का उपयोग कर सकते हैं:

int Top = bounds.Top; 
int Bottom = bounds.Bottom - 1; 
int Sign = 1; 

if (tabStrip.EffectiveOrientation == TabOrientation.Bottom) 
{ 
    Top = bounds.Bottom - 1; 
    Bottom = bounds.Top; 
    Sign = -1; 
} 

using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight)) 
{ 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top); 
} 

using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight)) 
{ 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign); 
} 

using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark)) 
{ 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom); 
} 

using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark)) 
    e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom); 
+3

आप SystemPens उपयोग करते हुए इस एक बहुत आसान बनाने में कर सकते हैं - http://msdn.microsoft.com/en-us/library/system.drawing.systempens.aspx – Simon

+0

इस कोड के लिए धन्यवाद! असली की तरह लग रहा है! धन्यवाद! :- डी – DxCK

0

यह एक "वहाँ" जवाब है, लेकिन यह है कि आप WPF इस्तेमाल कर सकते हैं हो सकता है? जैसा कि आप ऊपर दिए गए उत्तर से देख सकते हैं, यह कान में दर्द है जो Winforms में नियंत्रण को अनुकूलित करने के लिए है जहां डब्ल्यूपीएफ में प्रत्येक नियंत्रण लापरवाह है। इसका मतलब है कि आप जो प्रदान करते हैं उसे नियंत्रित करते हैं और यह पूरी तरह से कैसा दिखता है।

+0

सुझाव के लिए धन्यवाद, लेकिन मुझे विंडोज 2000 का समर्थन करने की आवश्यकता है, इसलिए डब्ल्यूपीएफ अभी मेरे लिए एक विकल्प नहीं है। – DxCK

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