--------------------
TWinControl收到WM_Paint消息(以后找个例子)--------------------
1. 消息函数
TWinControl.WMPaint (默认不是双缓冲)
2.1 如果没有csCustomPaint状态,就什么都不执行(一般来说到此结束)
2.2
如果有csCustomPaint状态,就调用,普通函数 TWinControl.PaintHandler(Message);
1).API剪裁所有子控件
ExcludeClipRect;
2).重画自己,虚函数 TWinControl.PaintWindow;
3).重画所有子控件,普通函数
PaintControls(挨个给子控件发送WM_PAINT消息,最后还要给窗口控件画边框。如果没有子控件这步什么都不做。)
-------------------- TCustomControl收到WM_Paint消息(大多数窗口控件)--------------------
1.
消息函数 TCustomControl.WMPaint,增加csCustomPaint状态
2.
有csCustomPaint状态,就调用,inherite TWinControl.WMPaint
3. 调用,普通函数
TWinControl.PaintHandler(Message);
1). API剪裁所有子控件
ExcludeClipRect;
2).
重画自己,TCustomControl.PaintWindow; 这里又会进一步调用TCustomControl.Paint;
函数(最关键的一步)
3). 重画所有子控件,普通函数
PaintControls(挨个给子控件发送WM_PAINT消息,最后还要给窗口控件画边框。如果没有子控件这步什么都不做。)
最后还要去掉csCustomPaint状态
-------------------- TGraphicControl收到WM_Paint消息(大多数图形控件)--------------------
1.
消息函数 TGraphicControl.WMPaint
2. 调用,虚函数 TGraphicControl.Paint; (到这步就完成了)
总结1:虚函数的特点就是升升降降,在重复利用父类函数(资源)的同时,即使调用同一名称的函数(必须是虚函数;即使是普通函数里也有可能调用其它虚函数),如有必要就自动调用子类覆盖的虚函数,而不必重新修改父类函数的代码。
总结2:这里只说收到WM_PAINT以后怎么做,没说之前是怎么做的,谁来发送WM_PAINT,为什么要发送这个消息等等,以后再分析。FIXME.
VCL控件对WM_PAINT消息的三种不同处理,布布扣,bubuko.com
原文:http://www.cnblogs.com/findumars/p/3681385.html