使用VisualStyles控件的边框颜色
微软的winform视觉样式一直让我困惑。使用VisualStyles控件的边框颜色
我想要一个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);
,我已经试过这样:
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>
为各位有意,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);
}
}
我现在在玩DrawThemeBackground。 Paint.NET告诉我TreeView的边框颜色是(130,135,144)。你的Tab.Pane.Normal建议非常接近,但它是(137,140,149)。 – LarsTech