首先介绍一下窗口过程的回调函数(WndProc):应用程序的消息来自于系统消息队列,被应用程序的主程序中的消息循环所处理。这个消息循环从应用程序的消息队列中取出消息,进行预处理,然后派发到消息对应的窗口过程,窗口过程在被调用后根据消息的类型进行相应的处理(回调函数)。
它带有四个参数,分别为:
窗口句柄(Window Handle) HWND,
消息ID(Message ID) UINT,
和两个消息参数(wParam, lParam)WPARAM、LPARAM,
WndProc的第一个参数hWnd就是当前接收消息的窗口句柄,第二个参数就是被传送过来的消息,第三、第四个参数都是附加在消息上的数据,这和MSG结构体是一样的。
窗口过程的回调函数可接收的其中一个消息叫WM_PAINT,它的其中两个消息参数(wParam, lParam)WPARAM、LPARAM都为空,当需要更新窗口的时候,都会发送这个消息,这些情况包括第一次打开时、放大时、从最小化状态打开时、将窗口从屏幕外拖回屏幕时、使用Invalidate()、Refresh()方法时等。
可见如果我们想要刷新窗口就必须使用Invalidate()、Refresh()方法:
Invalidate()使控件的特定区域无效并向控件发送绘制消息。六个重载:
Invalidate(Region, Boolean)
使控件的指定区域无效,并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。
Invalidate(Rectangle, Boolean)
使控件的指定区域无效,并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。
Invalidate(Region)
使控件的指定区域无效,并向控件发送绘制消息。
Invalidate(Rectangle)
使控件的指定区域无效,并向控件发送绘制消息。
Invalidate(Boolean)
使控件的特定区域无效并向控件发送绘制消息。 还可以使分配给该控件的子控件无效。
Invalidate()
使控件的整个图面无效并导致重绘控件。
需要注意的是系统不会在调用Invalidate()时发送WM_PAINT消息,而是直到其它消息处理完或遇到一个Update的调用才会发送消息。这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。不过这样也有利于提高绘制的效率:两个WM_PAINT消息之间通过多个Invalidate()使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。
有时我们并不需要这种优化而需要立即更新,此时我们可以手动发送这条消息,也可以使用Invalidate()+Update()或者Refresh()函数立即更新。
在更新界面中的控件的时候,系统会自动调用OnPaint()函数,而调用了OnPaint()函数将会引发Paint事件,此处指的是base.OnPaint(),如果你将系统的OnPaint()重写,而没有在重写的时候调用base.OnPaint(),那么重绘时将不会引发Paint事件。
在下面这个例子中演示了如何给pictureBox1控件的Paint 事件增加一个触发函数pictureBox1_Paint:
pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(pictureBox1_Paint)
在触发函数中我们可以进行绘图,或者将绘图步骤写到OnPaint()函数中,举例:
private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
// 获取控件的绘图资源类
Graphics g = e.Graphics;
// 在PictureBox中写字符串
g.DrawString("This is a diagonal line drawn on the control",fnt, System.Drawing.Brushes.Blue, new Point(30,30));
// 在PictureBox中划线
g.DrawLine(System.Drawing.Pens.Red, pictureBox1.Left, pictureBox1.Top,pictureBox1.Right, pictureBox1.Bottom);
}
顺便介绍下Graphics类,其提供了对象绘制到显示设备的方法,这是一个抽象基类,不能进行实例化,里面的方法太多不一一列举,具体看这个链接。若要创建一个画笔对象,使用从 Brush 派生出的类(定义用于填充图形形状(如矩形、椭圆、饼形、多边形和封闭路径)的内部的对象),如 SolidBrush、TextureBrush 和 LinearGradientBrush:
SolidBrush 类
定义单色画笔。 画笔用于填充图形形状,如矩形、椭圆、扇形、多边形和封闭路径。 此类不能被继承。
TextureBrush 类
TextureBrush 类的每个属性都是 Brush 对象,这种对象使用图像来填充形状的内部。 此类不能被继承。
LinearGradientBrush 类
使用线性渐变封装 Brush。 此类不能被继承。