对于每个画出来的对象,它都有一个Handle的概念,事实上就是控制点,比如DrawRectangle,它就有 /// <summary> /// Move handle to new point (resizing) /// </summary> /// <param name="point"></param> /// <param name="handleNumber"></param> public override void MoveHandleTo(Point point, int handleNumber) { int left = Rectangle.Left; int top = Rectangle.Top; int right = Rectangle.Right; int bottom = Rectangle.Bottom; switch ( handleNumber ) { case 1: left = point.X; top = point.Y; break; case 2: top = point.Y; break; case 3: right = point.X; top = point.Y; break; case 4: right = point.X; break; case 5: right = point.X; bottom = point.Y; break; case 6: bottom = point.Y; break; case 7: left = point.X; bottom = point.Y; break; case 8: left = point.X; break; } SetRectangle(left, top, right - left, bottom - top); }将其中一个控制点移动到新的位置并重设Rectangle的范围对于Move,它用 /// <summary> /// Move object /// </summary> /// <param name="deltaX"></param> /// <param name="deltaY"></param> public override void Move(int deltaX, int deltaY) { rectangle.X += deltaX; rectangle.Y += deltaY; } 来将rectangle的坐标进行平移
那也是画上去的,你看GraphicsList类中有public void Draw(Graphics g) { int n = graphicsList.Count; DrawObject o; // Enumerate list in reverse order to get first // object on the top of Z-order. for (int i = n - 1; i >= 0; i--) { o = graphicsList[i]; o.Draw(g); if (o.Selected == true) { o.DrawTracker(g); } } } 就是一个对象是selected状态时,就画Tracker,然后你再看DrawObject类中有/// <summary> /// Draw tracker for selected object /// </summary> /// <param name="g"></param> public virtual void DrawTracker(Graphics g) { if ( ! Selected ) return; SolidBrush brush = new SolidBrush(Color.Black); for ( int i = 1; i <= HandleCount; i++ ) { g.FillRectangle(brush, GetHandleRectangle(i)); } brush.Dispose(); } 都是画上去的
/// <summary>
/// Move handle to new point (resizing)
/// </summary>
/// <param name="point"></param>
/// <param name="handleNumber"></param>
public override void MoveHandleTo(Point point, int handleNumber)
{
int left = Rectangle.Left;
int top = Rectangle.Top;
int right = Rectangle.Right;
int bottom = Rectangle.Bottom; switch ( handleNumber )
{
case 1:
left = point.X;
top = point.Y;
break;
case 2:
top = point.Y;
break;
case 3:
right = point.X;
top = point.Y;
break;
case 4:
right = point.X;
break;
case 5:
right = point.X;
bottom = point.Y;
break;
case 6:
bottom = point.Y;
break;
case 7:
left = point.X;
bottom = point.Y;
break;
case 8:
left = point.X;
break;
} SetRectangle(left, top, right - left, bottom - top);
}将其中一个控制点移动到新的位置并重设Rectangle的范围对于Move,它用
/// <summary>
/// Move object
/// </summary>
/// <param name="deltaX"></param>
/// <param name="deltaY"></param>
public override void Move(int deltaX, int deltaY)
{
rectangle.X += deltaX;
rectangle.Y += deltaY;
}
来将rectangle的坐标进行平移
那也是画上去的,你看GraphicsList类中有public void Draw(Graphics g)
{
int n = graphicsList.Count;
DrawObject o; // Enumerate list in reverse order to get first
// object on the top of Z-order.
for (int i = n - 1; i >= 0; i--)
{
o = graphicsList[i]; o.Draw(g); if (o.Selected == true)
{
o.DrawTracker(g);
}
}
}
就是一个对象是selected状态时,就画Tracker,然后你再看DrawObject类中有/// <summary>
/// Draw tracker for selected object
/// </summary>
/// <param name="g"></param>
public virtual void DrawTracker(Graphics g)
{
if ( ! Selected )
return; SolidBrush brush = new SolidBrush(Color.Black); for ( int i = 1; i <= HandleCount; i++ )
{
g.FillRectangle(brush, GetHandleRectangle(i));
} brush.Dispose();
}
都是画上去的
{
// Remove old selection rectangle
ControlPaint.DrawReversibleFrame(
drawArea.RectangleToScreen(DrawRectangle.GetNormalizedRectangle(startPoint, oldPoint)),
Color.Black,
FrameStyle.Dashed); // Draw new selection rectangle
ControlPaint.DrawReversibleFrame(
drawArea.RectangleToScreen(DrawRectangle.GetNormalizedRectangle(startPoint, point)),
Color.Black,
FrameStyle.Dashed); return;
}
就是用来画选择框的