【问题标题】:Retrieve border color of WinForms ListBox/ListView rendered with OS visual styles检索使用 OS 视觉样式呈现的 WinForms ListBox/ListView 的边框颜色
【发布时间】: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_BORDERWS_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


【解决方案1】:

C#/WinForms 的快速解答:

var rend = new VisualStyleRenderer("ListBox", 0, 0);
Color borderColor = rend.GetColor(ColorProperty.BorderColor);

您还可以使用 [GetThemeColor}(https://docs.microsoft.com/en-us/windows/win32/api/uxtheme/nf-uxtheme-getthemecolor) 函数与 Windows API 检索相同的值属性标识符 3801:

但是,在一般情况下,边框可能包含不同的颜色值和/或与父级的背景混合,因此检索到的颜色值可能与您期望的不完全一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2011-07-22
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多