使用VisualStyles控件的边框颜色

Lar*_*ech 13 .net c# windows winforms visual-styles

微软为winforms提供的视觉风格总是让我迷惑不解.

我试图Panel坐在旁边TreeView,只是有相同的VisualStyle边框.

边框颜色

正如你所看到的,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);
Run Code Online (Sandbox Code Playgroud)

我试过这个:

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);
Run Code Online (Sandbox Code Playgroud)

是否有正确的视觉边框颜色或视觉元素使用的建议?

Cod*_*ray 8

此问题不仅限于WinForms ...由于WinForms TreeView控件只是本机Win32 TreeView控件的包装器,因此它绘制的系统中任何其他位置的TreeView控件都具有相同的边框样式,例如Windows资源管理器.正如您所观察到的,3D边框样式在启用视觉样式时看起来与在以前版本的Windows上看起来不同.它实际上看起来根本不是3D - 如果你将边框设置为Single/ FixedSingle,效果会更接近,除了它与TreeView周围的那个相比有点太暗了.

至于如何复制Panel控件,我认为诀窍不在于绘制边缘,而在于绘制背景.

如果您直接P/Invoke DrawThemeBackground函数以及.NET 包装器中未公开的某些部件和状态,可能会有一个更优雅的解决方案VisualStyleRenderer,但这个对我来说非常好看:

VisualStyleRenderer renderer =
              new VisualStyleRenderer(VisualStyleElement.Tab.Pane.Normal);
renderer.DrawBackground(e.Graphics, panel1.ClientRectangle);
Run Code Online (Sandbox Code Playgroud)

   

   (TreeView位于左侧; Panel位于右侧.)


如果您想自己绘制边框并匹配启用视觉样式时使用的颜色,您也可以这样做.这只是确定正确颜色的问题,然后使用标准GDI +绘图程序在控件周围绘制一行或两行.

但是暂时不要启动Photoshop!颜色都记录在名为的文件中AeroStyle.xml,位于includeWindows SDK 的文件夹中.你对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>
Run Code Online (Sandbox Code Playgroud)