2011-08-20 55 views
12

微軟的winform視覺樣式一直讓我困惑。使用VisualStyles控件的邊框顏色

我想要一個Panel坐在TreeView旁邊,只是有相同的VisualStyle邊框。

Border Colors

正如你所看到的,TreeView邊界比我的畫不同的嘗試,我Panel。面板的BorderStyle設置爲None。

我已經試過這樣:

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控件的包裝,它的繪圖相同的邊框樣式TreeView控件將在系統中其他地方,如Windows資源管理器。正如您所觀察到的,3D邊框樣式與啓用視覺樣式的樣式看起來有所不同,而不像以前的Windows版本。它實際上看起來沒有3D效果—如果將邊框設置爲Single/FixedSingle,則效果更接近,除了與TreeView周圍的邊框相比,它有點太暗。

至於如何複製,對於Panel控制,我想招不在於繪製邊緣,而是在繪製背景

有可能是一個更優雅的解決方案,如果您的P/Invoke的DrawThemeBackground function直接以及一些未在.NET VisualStyleRenderer包裝暴露Parts and States的,但是這看起來不錯對我說:

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

     

     (樹視圖在左邊;小組是在右邊。)


如果您想自己繪製邊框並匹配啓用視覺樣式時使用的顏色,那麼也可以這樣做。這只是一個確定正確顏色的問題,然後使用標準的GDI +繪圖程序在控件周圍繪製一兩條線。

但是不要啓動Photoshop!這些顏色全部記錄在位於Windows SDK的include文件夾中的名爲AeroStyle.xml的文件中。您對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。 Paint.NET告訴我TreeView的邊框顏色是(130,135,144)。你的Tab.Pane.Normal建議非常接近,但它是(137,140,​​149)。 – 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); 
    } 
}