承接前文,TSampleShape 圖形元件建構已完成基礎註冊、屬性發布、形狀枚舉與建構子/解構子覆寫。本節聚焦兩大關鍵能力:
TPen 與 TBrush 均擁有 OnChange 事件。元件建構時綁定統一處理器:
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); // 標記需重繪,觸發 WM_PAINT
end;
設計期屬性編輯器修改筆/刷屬性 → 觸發 OnChange → Invalidate → 即時預覽效果,無需手動重繪呼叫。
TGraphicControl 定義 procedure Paint; virtual;,覆寫實作自訂繪圖:
procedure TSampleShape.Paint;
var
R: TRect;
begin
with Canvas do
begin
Pen := FPen; // 套用當前筆屬性
Brush := FBrush; // 套用當前刷屬性
R := Rect(0, 0, Width, Height);
case FShape of
sstRectangle, sstSquare:
Rectangle(R);
sstRoundRect, sstRoundSquare:
RoundRect(R.Left, R.Top, R.Right, R.Bottom, Width div 4, Height div 4);
sstCircle, sstEllipse:
Ellipse(R);
end;
end;
end;
觸發時機: 視窗首次顯示、遮擋視窗移除、呼叫 Invalidate/Repaint、StyleChanged 內部呼叫。座標以元件客戶區左上角 (0,0) 為原點,Width/Height 確保正方形/圓形比例正確。