为什么不直接暴露画笔而不是控件的Color属性?

时间:2017-03-28 07:35:55

标签: c# winforms controls

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

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

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

不使用Color BackColor,Color ForeColor等颜色属性。 为什么我们不能直接将画笔暴露给控件,如Brush BackgroundBrush,Brush ForegroundBrush?

此致

2 个答案:

答案 0 :(得分:6)

两种类型之间存在巨大差异。 System.Drawing.Color是一个简单的值类型, struct 。没有做任何特别的事情,它基本上只存储颜色的alpha,红色,绿色和蓝色成分。没有麻烦,没有大惊小怪。

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

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

答案 1 :(得分:1)

因为很少使用它们。在多年的编程中(首先直接用于WinAPI,然后用ATL / WTL,然后在Winforms中),我还没有使用非实体画笔。它们的用途非常具体(对于孵化器我甚至无法想象它在彩色世界中的含义:-))

我补充一点,我总是讨厌我必须创建/销毁一个用纯色绘画的画笔:-)(但我喜欢那些不需要破坏的GetSysColorBrush

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