図形の描画方法の改良
標準の図形コントロールは,長方形や楕円だけでなく正方形や円を描画できますが,このサンプルにはまだその機能がありません。正方形や円は長方形や楕円と同様に扱われます。正方形や円を描画する場合は,図形の最も短い辺を見つけ,図形を中央に位置付けるコードを記述する必要があります。
正方形と円を正しく描画できるように改良した Paint を次に示します。
procedure TSampleShape.Paint;
var
X, Y, W, H, S: Integer;
begin with Canvas do
begin
Pen := FPen; { コンポーネントのペンをコピー }
Brush := FBrush; { コンポーネントのブラシをコピー }
W := Width; { コンポーネントの幅を使用 }
H := Height; { コンポーネントの高さを使用 }
if W < H then S := W else S := H; { 円/正方形の最小値を保管 }
case FShape of { 高さ,幅,位置を調整 }
sstRectangle, sstRoundRect, sstEllipse:
begin
X := 0; { 原点は図形の最上部左端 }
Y := 0;
end;
sstSquare, sstRoundSquare, sstCircle:
begin
X := (W - S) div 2; { 水平方向の中心合わせ... }
Y := (H - S) div 2; { ...垂直方向の中心合わせ }
W := S; { 幅の最短寸法を使用... }
H := S; { ...高さの最短寸法を使用 }
end;
end;
case FShape of
sstRectangle, sstSquare:
Rectangle(X, Y, X + W, Y + H); { 四角形と楕円を描画 }
sstRoundRect, sstRoundSquare:
RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); { 角の丸い長方形を描画 }
sstCircle, sstEllipse:
Ellipse(X, Y, X + W, Y + H); { 楕円を描画 }
end;
end;
end;
void __fastcall TSampleShape::Paint(void)
{
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 sstRoundRect:
case sstEllipse:
Y=X=0; // 原点は図形の最上部左端
break;
case sstSquare:
case sstRoundSquare:
case sstCircle:
X= (W-S)/2; // 水平方向の中心合わせ
Y= (H-S)/2; // 垂直方向の中心合わせ
break;
default:
break;
}
switch(FShape)
{
case sstSquare: // 四角形と楕円を描画
W=H=S; // 幅と高さの短い方を使用
case sstRectangle:
Canvas->Rectangle(X,Y,X+W,Y+H);
break;
case sstRoundSquare: // 角丸四角形と楕円を描画
W=H=S;
case sstRoundRect:
Canvas->RoundRect(X,Y,X+W,Y+H,S/4,S/4);
break;
case sstCircle: // 円と省略記号を描画
W=H=S;
case sstEllipse:
Canvas->Ellipse(X,Y,X+W,Y+H);
break;
default:
break;
}
}