delphi.gif (306 バイト) 図形の描画


このページではCanvasオブジェクトに図形を描くメソッドについて調べてみます。

メソッド 機能
Arc 弧を描く
Chord 弦を描く
Ellipse 楕円を描く
LineTo 線を引く
MoveTo 線の始点を決める
Pie 扇形を描く
Polygon 多角形を描く
Rectangle 長方形を描く
RoundRect 角の丸い長方形を描く

 

toach.gif (917 バイト) 直線を引くには

  1. MoveToメソッドで直線の始点を決めます。
  2. LineToメソッドで直線の終点を指定すると直線が引かれます。


Canvas.MoveTo(X0, Y0);
Canvas.LineTo(X1, Y1);

 

toach.gif (917 バイト) 中心と半径をパラメータとして円を描くには

  1. 円は楕円の特別なものなのでEllipseメソッドを使用します。
  2. Ellipseのパラメータは楕円の外接四角形の頂点の座標なので、中心と半径から外接四角形の頂点を計算する必要があります。
  3. 中心の座標が(X0,Y0)、半径がrのとき外接四角形の頂点は(X0-r,Y0-r),(X0+r,Y0+r)となります。これがマイナスにならないかをチェックしてEllipseを呼び出します。
  4. 注意:座標は実数ではないのでいつも正しい円が描けるとは限りません。


Canvas.Ellipse(X0-r,Y0-r,X1+r,Y1+r);

 

toach.gif (917 バイト) 中心と辺の長さをパラメータとして正方形を描くには

  1. 正方形は長方形の特別なものなのでRectangleを使用します。
  2. Rectangleのパラメータは左上頂点と右下頂点の座標なので、中心と辺の長さからこれらの座標を計算します。
  3. 中心の座標が(X0,Y0)、辺の長さがrのとき、2頂点は(X0-r/2,Y0-r/2),(X0+r/2,Y0+r/2)となります。これがマイナスにならないかをチェックしてRectangleを呼び出します。


Canvas.Rectangle(X0-r/2,Y0-r/2,X1+r/2,Y1+r/2);

toach.gif (917 バイト) 図形を消すには

CopyModeプロパティをcmSrcEraseとして、同じ図形を描きます。つぎの軌跡を描く方法もcmSrcEraseを使用しています。

 

toach.gif (917 バイト) マウスカーソルを押しながら移動したときの軌跡を描くには

マウスイベントとCopyModeプロパティを使って軌跡を描画します。

{ マウスが押されたとき }
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
    p0.X := X;  // 始点(p0: TPoint)
    p0.Y := Y;
    m_mousedown := True; // マウスが押された
end;

{ マウスが離された }
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     m_mousedown := False;  // マウスが押されていない
     p1.X := X;  // 終点 (p1: TPoint)
     p1.Y := Y;
     drawLine;  // 直線を引く
end;

{ 直線を引く }
procedure TForm1.drawLine;
begin
    if m_mousedown = True then
    begin
      Canvas.MoveTo(p0.X, p0.Y);
      Canvas.LineTo(p1.X, p1.Y);
    end;
end;

{ マウスが移動したとき }
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
     Canvas.CopyMode := cmSrcErase;  // ここがポイント
     p0.X := p1.X;  // それまでの終点を始点とする
     p0.y := p1.Y;
     p1.X := X;     // 新しい終点
     p1.Y := Y;
     drawLine;      // 線を引く
end;