2011-08-20 10 views
12

Winforms के लिए माइक्रोसॉफ्ट की दृश्य शैलियों ने हमेशा मुझे परेशान किया है।विज़ुअल स्टाइल का उपयोग कर नियंत्रण का सीमा रंग

मैं PanelTreeView के बगल में बैठने की कोशिश कर रहा हूं और केवल वही विजुअल स्टाइल सीमा है।

Border Colors

आप देख सकते हैं, TreeView सीमा मेरी Panel में मेरी ड्राइंग प्रयास से अलग है। पैनल की सीमा स्टाइल किसी के लिए सेट नहीं है।

मैं इस की कोशिश की है:

Rectangle r = new Rectangle(0, 0, panel1.ClientRectangle.Width - 1, panel1.ClientRectangle.Height - 1); 
    using (Pen p = new Pen(VisualStyleInformation.TextControlBorder)) 
    e.Graphics.DrawRectangle(p, r); 

और मैं इस की कोशिश की है: सही दृश्य सीमा रंग या विजुअल तत्व का उपयोग करने के लिए

VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.TextBox.TextEdit.Normal); 
renderer.DrawEdge(e.Graphics, panel1.ClientRectangle, 
     Edges.Bottom | Edges.Left | Edges.Right | Edges.Top, 
     EdgeStyle.Sunken, EdgeEffects.Flat); 

कोई सुझाव?

उत्तर

8

यह समस्या WinForms तक सीमित नहीं है ... चूंकि WinForms TreeView नियंत्रण केवल देशी Win32 TreeView नियंत्रण के चारों ओर एक रैपर है, यह उसी सीमा शैली को चित्रित कर रहा है क्योंकि ट्री व्यू नियंत्रण सिस्टम में कहीं और होगा, जैसे कि विन्डोज़ एक्सप्लोरर। और जैसा कि आपने देखा है, 3 डी सीमा शैली विंडोज़ के पिछले संस्करणों की तुलना में सक्षम दृश्य शैलियों के साथ अलग दिखती है। यह वास्तव में सभी — पर 3 डी नहीं दिखता है, यदि आप सीमा को Single/FixedSingle पर सेट करते हैं, तो यह प्रभाव करीब है, सिवाय इसके कि यह TreeView के आस-पास की तुलना में थोड़ा सा अंधेरा है।

जहाँ तक को दोहराने के लिए कैसे है कि एक Panel नियंत्रण के लिए के रूप में, मुझे लगता है कि चाल एक बढ़त ड्राइंग में नहीं है, बल्कि एक पृष्ठभूमि ड्राइंग में।

अगर आप पी/आह्वान DrawThemeBackground function सीधे Parts and States जो .NET VisualStyleRenderer आवरण में उजागर नहीं कर रहे हैं में से कुछ के साथ है, लेकिन यह एक मेरे लिए बहुत अच्छा लग रहा है एक और अधिक सुरुचिपूर्ण समाधान हो सकती है:

VisualStyleRenderer renderer = 
       new VisualStyleRenderer(VisualStyleElement.Tab.Pane.Normal); 
renderer.DrawBackground(e.Graphics, panel1.ClientRectangle); 

     

      (TreeView बाईं तरफ है, पैनल दाईं ओर है।)

0,123,

यदि आप सीमा को स्वयं आकर्षित करना चाहते हैं और दृश्य शैली सक्षम होने पर उपयोग किए गए रंगों से मेल खाते हैं, तो आप भी ऐसा कर सकते हैं। यह केवल सही रंग का निर्धारण करने और नियंत्रण के चारों ओर एक रेखा या दो खींचने के लिए मानक जीडीआई + ड्राइंग दिनचर्या का उपयोग करने का विषय होगा।

लेकिन अभी तक फ़ोटोशॉप को फायर न करें! रंग सभी को AeroStyle.xml नामक फ़ाइल में दस्तावेज किया गया है, जो विंडोज एसडीके के include फ़ोल्डर में स्थित है। आप globals मूल्यों में रुचि रखते हैं; इन:

<globals> 
    <EdgeDkShadowColor> 100 100 100</EdgeDkShadowColor> 
    <EdgeFillColor>  220 220 220</EdgeFillColor> 
    <EdgeHighLightColor>244 247 252</EdgeHighLightColor> 
    <EdgeLightColor> 180 180 180</EdgeLightColor> 
    <EdgeShadowColor> 180 180 180</EdgeShadowColor> 
    <GlowColor>   255 255 255</GlowColor> 
</globals> 
+0

मैं अभी उस DrawThemeBackground के साथ खेल रहा हूं। पेंट.नेट मुझे बता रहा है कि ट्री व्यू सीमा रंग है (130, 135, 144)। आपका Tab.Pane.Normal सुझाव बहुत करीब था, लेकिन यह था (137, 140, 14 9)। – LarsTech

2
रुचि रखते आप सभी के लिए

, here मैं समाधान नहीं मिला, कैसे आप Windows अपने नियंत्रण के लिए सही पृष्ठभूमि (PInvoke से उपयोग RECT परिभाषा आकर्षित कर सकते हैं।नेट):

const string CLASS_LISTVIEW = "LISTVIEW"; 
const int LVP_LISTGROUP = 2; 

[DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] 
private extern static int DrawThemeBackground(IntPtr hTheme, IntPtr hdc, int iPartId, int iStateId, ref RECT pRect, IntPtr pClipRect); 

public static void DrawWindowBackground(IntPtr hWnd, Graphics g, Rectangle bounds) 
{ 
    IntPtr theme = OpenThemeData(hWnd, CLASS_LISTVIEW); 
    if (theme != IntPtr.Zero) 
    { 
     IntPtr hdc = g.GetHdc(); 
     RECT area = new RECT(bounds); 
     DrawThemeBackground(theme, hdc, LVP_LISTGROUP, 0, ref area, IntPtr.Zero); 
     g.ReleaseHdc(); 
     CloseThemeData(theme); 
    } 
} 
संबंधित मुद्दे