④ 設置Owned對象的屬性
處理Pen和Brush對象的最後一步是處理Pen和Brush發生改變時對Shape控制的重畫問題。Pen和Brush對象都有OnChange事件,因此能夠在Shape控制中聲明OnChange事件指向的事件處理過程。
下面給Shape控制增加了該方法並更新了部件的constructor以使Pen和Brush事件指向新方法:
type
TSampleShape = class(TGraphicControl)
published
procdeure StyleChanged(Sender: TObject);
end;
implemintation
constructor TSampleShape.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
Width := 65;
Height := 65;
Fpen := TPen.Create;
FPen.OnChange := StyleChanged;
Fbrush := TBrush.Create;
FBrush.OnChange := StyleChanged;
end;
procedure TSampleShape.StyleChanged(Sender: TObject);
begin
Invalidate(true);
end;
當變化發生時,部件重畫以響應Pen或Brush的改變。
4. 怎樣畫部件圖形
圖形控制基本要素是在屏幕上畫圖形的方法。抽象類TGraphicControl定義了名為Paint的虛方法,可以覆蓋該方法來畫所要的圖形。
Shape控制的paint方法需要做:
● 使用用戶選擇的Pen和Brush
● 使用所選的形狀
● 調整座標。這樣,方形和圓可以使用相同的Width和Height
覆蓋paint方法需要兩步:
● 在部件聲明中增加Paint方法的聲明
● 在implementation部分寫Paint方法的實現
下面是Paint方法的聲明:
type
TSampleShape = class(TGraphicControl)
protected
procedure Paint; override;
end;
然後,編寫Paint的實現:
procedure TSampleShape.Paint;
begin
with Canvas do
begin
Pen := FPen;
Brush := FBrush;
case FShape of
sstRectangle, sstSquare :
Rectangle(0, 0, Width, Height);
sstRoundRect, sstRoundSquare:
RoundRect(0, 0, Width, Height, Width div 4, Height div 4);
sstCircle, sstEllipse :
Ellipse(0, 0, Width, Height);
end;
end;
end;
無論任何控制需要更新圖形時,Paint就被調用。當控制第一次出現,或者當控制前面的窗口消失時,Windows會通知控制畫自己。也可以通過調用Invalidate方法強制重畫,就象StyleChanged方法所做的那樣。