C# [OnPaint]和[OnPaintBackground]的区别
OnPaint和OnPaintBackground的主要功能区别
OnPaint:
OnPaint方法主要用于绘制控件的内容部分。这包括文本、图像、自定义图形(如线条、矩形等)以及其他构成控件可视化外观的元素。例如,在一个按钮控件中,OnPaint会负责绘制按钮上的文字、图标以及按钮的边框等内容。
这个方法是实现自定义绘图的关键部分。当你想要改变一个控件的外观,比如绘制特殊的文本效果、添加自定义的图形装饰等,你会在OnPaint方法中添加相应的绘图代码。
OnPaintBackground:
这个方法主要用于绘制控件的背景。当这个方法被调用时,它的主要职责是绘制在控件内容(比如文本、按钮上的图标等)之下的背景部分。例如,在一个Form(窗口)或者Panel(面板)控件中,OnPaintBackground可能会负责绘制纯色背景或者带有简单图案(如渐变背景)的背景部分。
它通常会在OnPaint之前被调用,这样可以先把背景绘制好,为后续的内容绘制提供一个基础。而且在一些情况下,系统或者父类可能会自动调用这个方法来确保背景的正确绘制,比如当控件大小改变或者需要重新绘制背景时。
调用时机和频率差异
OnPaint:
OnPaint方法会在控件的内容需要重新绘制时被调用。这可能是由于多种原因,如用户操作(比如鼠标移动到控件上、点击控件等)、数据更新导致内容改变、或者控件的可视状态改变(如从启用变为禁用,可能需要改变内容的绘制方式)等。
它的调用频率可能相对较高,因为控件的内容可能会因为各种交互或者数据变化而需要经常重新绘制。
OnPaintBackground:
调用时机通常是在控件的背景需要重新绘制的时候。例如,当控件的大小发生变化、控件被隐藏然后又显示、或者通过某些方法(如Invalidate方法触发重绘背景部分)时,OnPaintBackground可能会被调用。
它的调用频率相对较低,因为背景通常不需要频繁地重新绘制,除非有上述提到的导致背景改变的情况发生。
代码编写和用途示例
OnPaint示例:
对于一个自定义按钮控件,要在按钮上绘制特殊的文字效果(比如带有阴影的文字),可以在OnPaint方法中编写如下代码:
protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; // 先绘制文字阴影 using (Brush shadowBrush = new SolidBrush(Color.Gray)) { StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; g.DrawString(this.Text, this.Font, shadowBrush, new Rectangle(2, 2, this.Width, this.Height), format); } // 再绘制文字本身 using (Brush textBrush = new SolidBrush(this.ForeColor)) { StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; g.DrawString(this.Text, this.Font, textBrush, new Rectangle(0, 0, this.Width, this.Height), format); } base.OnPaint(e); }
这里先使用灰色画笔绘制了文字的阴影,然后使用前景色画笔绘制了文字本身,并且通过StringFormat对象来控制文字的居中对齐。最后调用base.OnPaint(e)来保证基类的绘制逻辑(如果有的话)也能够执行。
OnPaintBackground示例:
假设你有一个自定义的面板控件,想要给它设置一个渐变背景。你可以在OnPaintBackground方法中添加如下代码(这里以 C# 和 Windows Forms 为例):
protected override void OnPaintBackground(PaintEventArgs pevent) { Graphics g = pevent.Graphics; // 创建一个线性渐变画笔 LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, Color.Blue, Color.White, LinearGradientMode.Vertical); g.FillRectangle(brush, this.ClientRectangle); base.OnPaintBackground(pevent); }
这里使用Graphics对象和线性渐变画笔来填充面板的矩形区域,实现了渐变背景的绘制。
最后调用base.OnPaintBackground(pevent)来确保基类的背景绘制逻辑(如果有的话)也能执行。
转载请注明出处。