上一篇,我们利用窗体的Paint事件中的参数实例化了一个Graphic,在这个基础上完成了绘图,这个绘图是窗体的事件,所绘的图也就限定在窗体上了。这个和在窗体内重载Paint事件绘图基本效果基本一样。我们来看看具体的代码实对应的函数。
一、对应的函数 onPaint
控件的绘图和窗体的绘图所对应的函数名不一样,窗体的叫做Paint,而控件的叫做OnPaint,而且是重载的函数。
namespace formDraw
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
//这里放弃不用,我们重载OnPaint效果是一样的
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawRectangle(new Pen(Color.Green), new Rectangle(Width / 4, Height / 4, Width / 2, Height / 2));
}
}
}
如果我们想绘制在其他的控件上面,比如一个Button上,那么我们就不能借助于上面的方法了。我们要开启一种新思路,那就是利用CreateGraphics()来直接实例话一个Graphic对象。
二、准备按钮
建一个窗体并拖放一个按钮在窗体上,如下图所示:
三、代码实现
我们准备在窗体加载的时候来实现绘图,那么我们在双击窗体进入Form_Click事件,或者在form的事件中直接激活Click事件,代码如下:
private void Form1_Click(object sender, EventArgs e)
{
Graphics gb = this.button1.CreateGraphics();
gb.DrawRectangle(new Pen(Color.Black), new Rectangle(button1.Width / 4-2, button1.Height / 4-2, button1.Width / 2+3, button1.Height / 2+3));
gb.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(button1.Width / 4, button1.Height / 4, button1.Width / 2, button1.Height / 2));
}
点击窗体,运行效果如下:
从代码和运行效果我们可以看出,这个基本和Paint事件中利用参数实例化出来的Graphic对象绘图没有任何差别。但值得注意的是,这个图形在窗体重绘的时候会被窗体的绘图事件给覆盖,所以要真正使我们的绘图能够随窗体更新,还是要放在重绘事件中去。
感兴趣的童鞋可以继续关注
VS2017中GDI+绘图轻松入门(3)