【问题标题】:Why brushes are not exposed directly instead of Color properties for a control?为什么不直接暴露画笔而不是控件的颜色属性?
【发布时间】:2017-03-28 07:35:55
【问题描述】:

一般来说,控件的背景色设置将在 OnPaint() 中绘制,画笔使用控件的背景色创建,如下所示,

using (SolidBrush brush = new SolidBrush(this.BackColor))
{
   e.Graphics.FillRectangle(brush, e.ClipRectangle);
}

我的问题是,为什么颜色会暴露在外面,为什么会在内部创建画笔。

而不是公开颜色属性,如 Color BackColor、Color ForeColor。 为什么我们不能像 Brush BackgroundBrush、Brush ForegroundBrush 那样直接将画笔暴露给控件?

问候,

【问题讨论】:

  • (这里不是 GDI 专家,在 C++ 中为 WinAPI 编程了几年,但没什么特别的)...我认为非实体画笔是 GDI 中使用最少的部分之一:- )
  • 看来您来自 wpf 世界(或类似世界),因为那里的控件确实暴露了 brushes。这个问题虽然很枯燥,但它会解决什么问题? Winforms 很旧,尝试使用纯 winapi 进行编程以了解它在当时的价值,但对于当前的标准来说它只是旧的。如果您实施自定义绘画,那么您也可以添加您提到的属性,再次,您是否有问题,例如BackgroundBrush 还是什么?
  • @Sinatr - 没问题。只是想知道为什么使用颜色而不是画笔。
  • 过去画笔是系统资源(对象),你必须dispose them。制作Brush 类型的属性将为每个控件分配它或需要一些方法来共享引用等(忽略有predefined brushes)。颜色很容易。较新的框架没有问题,例如wpf SolidColorBrush 不必处理(但它也有预定义的画笔,这次是为了方便)。

标签: c# winforms controls


【解决方案1】:

这两种类型有很大的区别。 System.Drawing.Color 是一个简单的值类型,一个 struct。没有做任何特别的事情,它基本上只是存储颜色的 alpha、red、green 和 blue 分量。没有麻烦,没有大惊小怪。

SolidBrush 的分量要大得多。它是一种创建起来非常便宜(不到一微秒)但存储起来非常昂贵的类。它是一个操作系统对象的包装类,画笔存储在桌面堆上。由于 appcompat 的原因,一直回到 Win3,在桌面上运行的所有应用程序都需要共享该堆,并且它不能存储超过 65535 个对象。这迫使微软程序员实现 IDisposable 以确保在垃圾收集器开始调用终结器之前足够早地销毁本机对象。并让这段代码使用using 语句。

请注意Brushes class,它具有方便的属性,可提供指定颜色的实心画笔。与 Color 类型如何提供命名颜色非常相似,例如 Color.AliceBlue 与 Brushes.AliceBlue。方便,但在引擎盖下并不那么漂亮,画笔对象在应用程序的整个生命周期中都存在。一个可以接受的折衷方案是,假设应用程序经常使用画笔,并且命名颜色太少而不会冒着耗尽桌面堆的风险。在这种情况下不可用,this.BackColor 可以是任何颜色。

【讨论】:

    【解决方案2】:

    因为它们很少使用。在多年的编程中(首先直接用于 WinAPI,然后使用 ATL/WTL,然后在 Winforms 中)我从未使用过非实体画笔。它们的用途非常具体(对于孵化刷,我什至无法想象在彩色世界中它会是什么:-))

    我要补充一点,我一直讨厌我必须创建/销毁刷子才能用纯色绘画:-)(但我喜欢不需要销毁的 GetSysColorBrush

    如果您真的需要它们,您可以轻松地继承您喜欢的控件并重载OnPaint 消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2022-01-22
      • 2018-12-03
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多