使用VisualStyles控件的边框颜色

问题描述:

微软的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); 

任何建议正确的视觉边界的颜色或视觉元素使用?

这个问题不限于的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

为各位有意,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); 
    } 
}