首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.NET框架中用鼠标移动GDI绘制的圆?

如何在.NET框架中用鼠标移动GDI绘制的圆?
EN

Stack Overflow用户
提问于 2011-11-26 15:07:33
回答 2查看 2K关注 0票数 0

我用GDI+Form1上画了一些圆,圆的中心是Custom Control的一个红色小矩形,它是从User Control派生出来的,它是Form1的位图的BackgroundImage属性,也是由GDI+用几种颜色绘制的。

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

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

代码语言:javascript
复制
   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();
        }
    }

如何去除在MouseMove程序中由GDI+绘制的黑色圆圈?我用谷歌搜索了几个网站,都没有得到满意的答案。希望你能给我一些提示,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-26 15:41:57

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

在窗体的Paint事件中,添加以下内容(假设红色矩形控件的名称为"CircleCenter“,窗体的名称为"Form1"):

代码语言:javascript
复制
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));
}

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

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2011-11-26 15:39:07

您将需要始终重置整个GObject (擦除您在其上绘制的图像),然后重新绘制它们。

这可以通过简单地使用您从中获得Graphics对象的对象的颜色绘制一个矩形来完成(虽然您没有提到它,但我认为GObject是一个Graphics对象,获得了一些win控件?)。

所以就像这样:

代码语言:javascript
复制
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.

应隐藏旧图形,并在新位置重新绘制圆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8276896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档