Как с помощью мыши переместить круг, нарисованный GDI в .NET Framework? - PullRequest
0 голосов
/ 26 ноября 2011

Я нарисовал несколько кружков на Form1, используя GDI+, и центр круга - маленький красный прямоугольник Custom Control, который получен из User Control, свойства BackgroundImage Form1 ' Растровое изображение, которое также рисуется GDI+ несколькими цветами.

То, что я хочу, это то, что, когда я перемещаю красный прямоугольник (центр круга) с помощью мыши, круг также перемещается вслед за красным прямоугольником. Используя событие MouseDown, MouseMove, я мог плавно перемещать красный прямоугольник с помощью мыши.

Моя проблема в том, как переместить круг, соответствующий красному прямоугольнику (центр круга). Я включил двойную буферизацию, чтобы решить проблему мерцания. CircleCenter является объектом класса Custom Control (например, красный прямоугольник). GObject является объектом Grahpics. Вот некоторые коды клавиш:

   public Form1()
   {
        InitializeComponent();
        this.SetStyle(ControlStyles.DoubleBuffer |    //enables double-buffering
                      ControlStyles.UserPaint |
                      ControlStyles.AllPaintingInWmPaint,
                      true);
    }

   Point CCenterPoint = new Point();
   private int Diameter = 250;
   private void CircleCenterMouseDown(object sender, MouseEventArgs e)
   {
        CCenterPoint = new Point(-e.X, -e.Y);
   }

    private void CircleCenterMouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
                Point MousePos = CircleCenter.MousePosition;
                MousePos.Offset(CCenterPoint.X, CCenterPoint.Y);
                CircleCenter.Location = CircleCenter.Parent.PointToClient(MousePos);
                CircleCenter.BringToFront();
                CirclePen.Color = Color.Black;
                GObject.DrawEllipse(CirclePen, CircleCenter.Left- Diameter/2, CircleCenter.Top - Diameter/2, Diameter, Diameter);
                 this.Invalidate();
        }
    }

Как убрать черный кружок, нарисованный GDI+, полученный в процессе MouseMove? Я погуглил несколько сайтов и не получил удовлетворенного ответа. Надеюсь, вы могли бы дать мне несколько советов, Thx!

Ответы [ 2 ]

2 голосов
/ 26 ноября 2011

Ну, как я понял из вашего вопроса, вам просто нужно нарисовать круг вокруг красного прямоугольника, это довольно просто.

В событии Paint формы добавьте следующее (при условии, что ваш красный прямоугольник имеет имя «CircleCenter», а ваша форма была названа «Form1»):

private void Form1_Paint(object sender, PaintEventArgs e)
{
    // get the Graphics object of the form.
    Graphics g = e.Graphics;
    // create a think red pen for the circle drawing
    Pen redPen = new Pen(Brushes.Red, 4.0f);
    // drawing the circle
    PointF ctrlCenter = GetCenterOfControl(CircleCenter);
    g.DrawEllipse(redPen,
            ctrlCenter.X - (Diameter / 2),
            ctrlCenter.Y - (Diameter / 2),
            Diameter, Diameter);
}

//The following little method to calculate the center point
PointF GetCenterOfControl(Control ctrl)
{
    return new PointF(ctrl.Left + (ctrl.Width / 2),
            ctrl.Top + (ctrl.Height / 2));
}

ЛюбойКстати, я знаю, это выглядит долго для такой простой задачи, как рисование кругов!вот уродливая однострочная версия приведенного выше кода:

e.Graphics.DrawEllipse(new Pen(Brushes.Red, 4.0f), (centerCircle.Left + (centerCircle.Width / 2)) - (Diameter / 2), (centerCircle.Top + (centerCircle.Height / 2)) - (Diameter / 2), Diameter, Diameter);
0 голосов
/ 26 ноября 2011

Вам нужно будет всегда сбрасывать весь объект GObject (стирать нарисованные на нем изображения), а затем перерисовывать их снова.

Это можно сделать, просто нарисовав прямоугольник с цветом объекта, из которого вы получили объект Graphics (хотя вы не упомянули об этом, я думаю, что GObject является объектом Graphics, полученным из некоторого элемента управления win?).

Так что-то вроде:

Control control = CircleCenter.Parent; // Parent control where you get Graphics object from.
System.Drawing.SolidBrush sBrush = new System.Drawing.SolidBrush(control.BackColor); // Brush to be used with the same color like the one of the parent control.
GObject.FilledRectangle(sBrush, new Rectangle(0, 0, control.Width, control.Height); // Erase background.
GObject.DrawEllipse(CirclePen, CircleCenter.Left- Diameter/2, CircleCenter.Top - Diameter/2, Diameter, Diameter); // Do your stuff.

следует скрыть старые рисунки и заново нарисовать круг на новом месте.

...