【发布时间】:2021-11-24 16:18:34
【问题描述】:
如果我们创建一个新的 WinForms .NET 项目并在其上放置一个 ListBox 或 ListView 控件,默认情况下它们会使用 OS 视觉样式呈现:
我需要绘制一个 1 像素的边框,类似于系统在我的自定义控件中为 ListBox/ListView 提供的边框。有没有办法使用系统调用来检索 ListBox/ListView 的系统边框颜色?
【问题讨论】:
-
您有显示您需要的示例图片吗?我个人使用放置其他控件(如 ListBox)的 GroupBox。通过更改 Padding 和 Margin,您可以将它们设置为非常接近 ListBox 边框,但同样,我真的不知道这是否是您所追求的。
-
查看VisualStyleRenderer 类。某些特定控件有默认呈现样式,因此您可能应该指定要构建的控件类型。 -- 请注意,如果您只需要您的控件显示默认的单边框或 3D 边框,则可以覆盖 CreateParams 并将样式
WS_BORDER或WS_EX_CLIENTEDGE添加到 ExStyle(Fixed3D 版本)。 -
@Jimi,正确的问题应该是如何“按原样”绘制 ListView 边框,因为在一般情况下,这个边框可以是渐变或我们能想到的任何东西(甚至比 1 像素厚线)。但我需要为里面的自定义内容绘制 1 像素的边界矩形。我想我需要的是
VisualStyleRenderer.GetColor。 -
嗯,这可能不会使颜色适应背景。当您将控件添加到父容器时,边框是根据考虑父背景亮度的计算来呈现的,因此并不总是相同的。试试这个,在自定义控件的
OnPaint()覆盖中:var renderer = new VisualStyleRenderer(VisualStyleElement.Button.PushButton.Normal); var edges = Edges.Left | Edges.Top | Edges.Right | Edges.Bottom; renderer.DrawEdge(e.Graphics, new Rectangle(10, 10, 50, 50), edges, EdgeStyle.Raised, EdgeEffects.Mono);。然后更改背景颜色... -
@Jimi,首先,看看我的截图。这是一个经典的 WinForms 应用程序,包含 TextBox、ListBox、ListView。即使您将表单的 BackColor 更改为 LimeGreen,这 3 个控件的边框颜色仍保持不变。其次,我找到了 ListBox 和 ListView 的主题 TMT_BORDERCOLOR 颜色属性(ID 为 3801)。它返回我需要的正确值。那么,检索 TMT_BORDERCOLOR 主题属性并用这种颜色绘制边框仍然是一个坏主意吗?
标签: winforms listview listbox border visual-styles