コンポーネントイメージの描画
グラフィックコントロールの本質は,画面にイメージを描画する方法で決まります。コントロールにイメージを描画するには,TGraphicControl 抽象型で定義されている Paint というメソッドをオーバーライドします。
図形コントロールの Paint メソッドは,以下の条件を満たすように作成します。
- 選択されたペンとブラシを使用する
- 選択された図形を使用する
- 正方形と円の場合は幅と高さを同じにする
Paint メソッドをオーバーライドする手順は次のとおりです。
- コンポーネントの宣言に Paint を追加します。
- ユニットの 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 メソッドでも行っている方法です。