如何使用鼠标移动.NET Framework中的GDI绘制的圆圈?

时间:2011-11-26 07:07:33

标签: c# .net gdi+

我使用Form1GDI+上绘制了一些圆圈,圆圈的中心是Custom Control的一个小红色矩形,来自User Control,{ {1}} BackgroundImage'位图的属性,也由Form1以多种颜色绘制。

我想要的是当我用鼠标移动红色矩形(圆心)时,圆圈也会跟随红色矩形移动。使用GDI+MouseDown事件,我可以使用鼠标平滑移动红色矩形。

我的问题是如何移动与红色矩形(圆心)对应的圆圈。 我启用了双缓冲来解决闪烁问题。 MouseMoveCircleCenter类的对象(例如红色矩形)。 Custom Control是Grahpics对象。 以下是一些关键代码:

GObject

如何移除 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+所绘制的黑色圆圈? 我搜索了几个网站并没有得到满意的答案。希望你能给我一些提示,谢谢!

2 个答案:

答案 0 :(得分:2)

嗯,正如我从你的问题中所理解的,你只需要在红色矩形周围画一个圆圈,这很容易。

在表单的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));
}

无论如何,我知道像Circle绘图这样的简单任务看起来很长!这是上面代码的丑陋的一行版本:

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);

答案 1 :(得分:0)

您需要始终重置整个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.

应该隐藏旧图纸并在新位置重新绘制圆圈。