コンポーネントイメージの描画

提供: RAD Studio
移動先: 案内検索

グラフィック コンポーネントの作成:インデックス への移動

グラフィックコントロールの本質は,画面にイメージを描画する方法で決まります。コントロールにイメージを描画するには,TGraphicControl 抽象型で定義されている Paint というメソッドをオーバーライドします。

図形コントロールの Paint メソッドは,以下の条件を満たすように作成します。

  • 選択されたペンとブラシを使用する
  • 選択された図形を使用する
  • 正方形と円の場合は幅と高さを同じにする

Paint メソッドをオーバーライドする手順は次のとおりです。

  1. コンポーネントの宣言に Paint を追加します。
  2. ユニットの implementation 部に Paint メソッドを記述します。

この図形コントロールの場合,クラスの宣言で次のようにメソッドを宣言します。



 type
   TSampleShape = class(TGraphicControl)
   .
   .
   .
   protected
     procedure Paint; override;
   .
   .
   .
   end;



 class PACKAGE TSampleShape : public TGraphicControl
 {
   .
   .
   .
 protected:
     virtual void __fastcall Paint();
     .
     .
     .
 };



次に,ユニットの implementation 部にメソッドを記述します。



 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;



 void __fastcall TSampleShape::Paint()
 {
   int X,Y,W,H,S;
   Canvas->Pen = FPen;                                // コンポーネントのペンをコピー
   Canvas->Brush = FBrush;                            // コンポーネントのブラシをコピー
   W=Width;                                           // コンポーネントの幅を使用
   H=Height;                                          // コンポーネントの高さを使用
   X=Y=0;                                             // 円/正方形の最小値を保管
   if( W<H )
     S=W;
   else
     S=H;
   switch(FShape)
   {
     case sstRectangle:                                // 四角形と楕円を描画
     case sstSquare:
       Canvas->Rectangle(X,Y,X+W,Y+H);
       break;
     case sstRoundRect:                                // 角丸四角形と楕円を描画
     case sstRoundSquare:
       Canvas->RoundRect(X,Y,X+W,Y+H,S/4,S/4);
       break;
     case sstCircle:                                   // 円と省略記号を描画
     case sstEllipse:
       Canvas->Ellipse(X,Y,X+W,Y+H);
       break;
     default:
       break;
   }
 }



コントロールがイメージを更新する必要があるときは常に Paint が呼び出されます。コントロールが最初に表示される場合や,コントロールの前面に表示されているウィンドウが移動した場合は,そのコントロールが描画されます。Invalidate を呼び出して再描画を強制することもできます。これは StyleChanged メソッドでも行っている方法です。