一个控件 应该什么时候绘制 主要有两个
一个是 系统来确定 这个控件需要绘制 比如 最小化后在最大化 那么此时 系统会发出WM_PAINT 消息来告知控件 你需要重绘了
另一个就是 人为的调用this.Invalidate()或者this.Invalidate(Rectangle)来自己触发一次重绘
对于第一种 那是系统自身的一种行为 不管你是什么控件系统自带的还是自己写的 对于一些操作必然是要重绘界面的 比如刚才我说的最小化后 在最大化 控件隐藏后 在显示 得到焦点 失去焦点 之类的 这种是必然要重绘的
对于第二种 比如我要自己写一个datagridview 那么系统压根就不会知道这个是什么控件 对于系统而言 他只能决定我刚才说的第一种情况来触发控件的绘制
但是我现在像datagrid里面添加了数据 我需要把数据绘制出来
假设我控件提供了Add(方法)
当我调用add时候系统不会知道需要绘制控件 所以我需要自己在Add() 里面添加(this.Invalidate()) 来手动触发一个WM_PAINT消息
而WM_PAINT消息被触发的时候 会执行OnPaint函数
然后在OnPaint中 自己把数据绘制到界面上去
而我需要调用this.Invalidate()或者this.Invalidate(Rectangle)
class DrawingControl
{
[DllImport(“user32.dll”)]
public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);
private const int WM_SETREDRAW = 11;
public static void SuspendDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
}
public static void ResumeDrawing( Control parent )
{
SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
parent.Refresh();
}
}