非可视控件的问题(100分)

  • 主题发起人 主题发起人 zhengli
  • 开始时间 开始时间
Z

zhengli

Unregistered / Unconfirmed
GUEST, unregistred user!
  我看了TFORM类的声明及实现,发现他的Paint过程被声明为Abstract;

Virtual;后面并没有类似WM_PAINT的消息响应,但他的子类重载了Paint后,

每当需要重画时,便会执行Paint,我想知道他为什么会响应重画消息?

  还有,如果继承的父类是非可视的,能否在子类中写一个响应重画消息的

过程,即让他可视,用WM_PAINT行不行?
 
Tform or Tcustomform?

要响应paint事件,加个wm_paint不就行了.至于何时重载,则是要在结构上考虑的,如:
从一个tcustom...类(此类一般不直接使用)可继承出多个实用的类,在继承的这几个
类中各自override各自的paint,当然,如果你的paint事件在各子类中都一样处理的
话,就可以将事件放在父类的paint中,而不用override了.
 
在子类中是不行的,你可以在子类实类创建的时候,先截取Form的WindowProc,
然后实现WM_PAINT. 例如:
constructor TMyControl.Create(Owner:TControl);
begin
Inherited;
FOwner:=Owner;
if Assigned(Owner) then
begin
FOldProc:=Owner.WindowProc;
Owner.WindowProc:=MyWindProc;
end;
end;
destructor TMyControl.Destroy;
begin
if Assigned(FOwner) then FOwner.WindowProc:=FOldProc;
Inherited;
end;

procedure TMyControl.MyWindProc(var Message: TMessage);
begin
if Message.Msg=WM_Paint then ....//截获WM_Paint消息
else FOldProc(Message);
end;


 
父类如果实现了paint方法就用父类的, 自己不用重写, 如果继承的是非可视的父类,
那么就应该自己写paint.
 
可能是TCustomForm,他的Paint没加WM_PAINT但还是可以响应重画消息,Why?
 
因为TCustomForm是继承TWinControl,而TWinControl有Paint,或TWinControl
响应了WM_PAINT,在消息处理过程中调用了抽象函数Paint;
 
在protect中加入 procedure paint;override
然后不就自己可以重画了吗?
 
多人接受答案了。
 
后退
顶部