什么是在用户控件中配置画笔的更好方法

时间:2011-11-24 07:16:25

标签: c# .net winforms

使用新的Brush in Paint事件是更好的方法,即

protected override void OnPaint(PaintEventArgs e) {
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    using (SolidBrush b = new SolidBrush(Color.FromArgb(129, 242, 121))) {
        for (int i = 0; i < 12; i++) {    
            e.Graphics.FillPath(b, path[i]);
        }
    }
    base.OnPaint(e);
}

或在顶部定义一次并在Dispose Method中处理,即

SolidBrush _brush;
protected SolidBrush Brush {
    get {
        if (_brush == null)
            _brush = new SolidBrush(Color.FromArgb(129, 242, 121));
        return _brush;
    }
}

3 个答案:

答案 0 :(得分:17)

创建和销毁画笔和画笔等绘图对象非常便宜,大约需要一微秒。实际绘制代码的代码成本的一小部分,通常以毫秒为单位。因此,您应该避免存储它们,这只占用操作系统GDI对象堆中的宝贵空间,这是一个需要由所有正在运行的进程共享的资源。创建的唯一绘图对象是字体。但是,Winforms通过在内部缓存字体来解决这个问题。

使其保持一致,始终将使用语句应用于绘制您创建的对象。

答案 1 :(得分:5)

如果可以,请使用预定义的Brushes(并且不要丢弃它们)。如果你不能建议我不要在每个油漆上创建刷子,而是缓存它们:

IDictionary<Color, Brush> SolidBrushes; //... cache
Brush GetSolidBrush(Color color) {
    if(color.IsSystemColor) 
        return GetSystemBrush(color);
    Brush result = null;
    if(!SolidBrushes.TryGetValue(color, out result)) {
        result = new SolidBrush(color);
        SolidBrushes.Add(color, result);
    }
    return result;
}
Brush GetSystemBrush(Color color) {
    return SystemBrushes.FromSystemColor(color);
}

附加:关于这个问题的最佳答案可能是“取决于任务”。画笔创建是昂贵的,因为画笔本身(它是非托管GDI +对象上的托管包装),也是因为每个Paint事件上的所有画笔都进行了垃圾收集。因此,如果你使用多个刷子,最好缓存它们(当然,缓存的刷子应该在处置所有者控制或皮肤更换时处理)。但是如果你只使用一个画笔(第一种情况)不需要thr缓存 - 只使用使用块的画笔

答案 2 :(得分:0)

从性能的角度来看,我更喜欢创建一个画笔并将其处理在Dispose方法中。