Invalidate与CN_DRAWITEM的关系(200分)

  • 主题发起人 主题发起人 jimi_chen
  • 开始时间 开始时间
J

jimi_chen

Unregistered / Unconfirmed
GUEST, unregistred user!
1.众所周知,Invalidate会发送WM_PAINT消息
2.通过查看VCL源码Buttons.pas发现,TBitBtn中使用Invalidate会发送CN_DRAWITEM消息
3.另外由于源码中:
procedure TBitBtn.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do Style := Style or BS_OWNERDRAW;//告诉系统本window由自己负责绘制
end;
所以才会有CN_DRAWITEM消息
----------------------------------
那位能详细讲述一下消息WM_PAINT, CN_DRAWITEM, Invalidate之间的关系?
还有何时应该使用Invalidate,何时应该使用Repaint?
 
Invalidate;(delphi)-->InvalidateRect(..)(windows)-->WM_NCPAINT-->WM_PAINT-->WM_CTLCOLORBTN-->WM_EASEBKGND-->WM_DRAWITEM-->CN_DRAWITEM
 
Invalidate重画整个表面的,WM_PAINT是windows的通知消息,CN_DRAWITEM是VCL自定义的,
用来通知绘制某些表面
 
后退
顶部