首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 自訂元件進階:圖形元件筆刷事件響應與 Paint 繪圖虛擬方法實作

     編輯:Delphi

19.3.2.4 圖形元件核心擴充:從屬性發布到繪圖實作

承接前文,TSampleShape 圖形元件建構已完成基礎註冊、屬性發布、形狀枚舉與建構子/解構子覆寫。本節聚焦兩大關鍵能力:

Owned 物件 (Pen/Brush) 變更自動重繪機制

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 → 即時預覽效果,無需手動重繪呼叫。

Paint 虛擬方法:繪圖邏輯的唯一入口

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 確保正方形/圓形比例正確。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved