微软的winforms视觉风格一直困扰着我。
我想要一个Panel坐在一个TreeView旁边,只是有相同的VisualStyle边框。
正如你所看到的, TreeView边框与我的Panel绘图尝试不同。 面板的BorderStyle设置为None。
在本地主机上托pipe的REST API,无需pipe理权限
在Windows 10上通过C#closuresWi-Fi
在.NET中检测远程DHCP服务器
以编程方式监视磁盘活动(Windows)
捕获屏幕截图包括.NET中的半透明窗口
我试过这个:
Rectangle r = new Rectangle(0,panel1.ClientRectangle.Width - 1,panel1.ClientRectangle.Height - 1); using (Pen p = new Pen(VisualStyle@R_883_404[email protected])) 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);
任何build议正确的视觉边框颜色或视觉元素使用?
计划Windows任务与C#编程
如何获取mscorlib.ni.lib(.Net Framework 3.5)的PDB文件
C#:如何判断EXE是否有图标?
为什么winform面板仅在鼠标hover或鼠标点击时更新?
将键码转换为相关的显示字符
此问题不限于WinForms …因为WinForms TreeView控件只是本地Win32 TreeView控件的一个包装,所以它将在系统中的任何其他位置(如Windows资源管理器)中绘制与TreeView控件相同的边框样式。 正如您所观察到的,3D边框样式与启用的视觉样式看起来有所不同,而不像以前版本的Windows。 它实际上看起来没有3D效果 – 如果将边框设置为Single / FixedSingle ,效果更接近,除了与TreeView周围的效果相比,它有点太黑。
至于如何复制Panel控件,我认为诀窍不在于绘制边缘 ,而是绘制背景 。
如果您直接调用DrawThemeBackground函数以及.NET VisualStyleRenderer封装器中未公开的某些部分和状态 ,可能会有一个更优雅的解决方案,但是这对我来说看起来相当不错:
VisualStyleRenderer renderer = new VisualStyleRenderer(VisualStyleElement.Tab.Pane.normal); renderer.DrawBackground(e.Graphics,panel1.ClientRectangle);
(TreeView在左边,Panel在右边。)
如果您想自己绘制边框并匹配启用视觉样式时使用的颜色,则也可以这样做。 这只是一个确定正确颜色的问题,然后使用标准的GDI +绘图程序在控件周围绘制一两条线。
但是不要启动Photoshop! 这些颜色全部记录在名为AeroStyle.xml文件中,该文件位于Windows SDK的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>
对于你感兴趣的所有人来说, 在这里我找到了解决办法,你如何让Windows为你的控件绘制正确的背景(使用pinvoke.net的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,ref area,IntPtr.Zero); g.ReleaseHdc(); CloseThemeData(theme); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。