図形の描画方法の改良

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

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

標準の図形コントロールは,長方形や楕円だけでなく正方形や円を描画できますが,このサンプルにはまだその機能がありません。正方形や円は長方形や楕円と同様に扱われます。正方形や円を描画する場合は,図形の最も短い辺を見つけ,図形を中央に位置付けるコードを記述する必要があります。

正方形と円を正しく描画できるように改良した 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;
   }
 }