2011-11-26 16 views
0

我画上使用GDI+Form1一些圈,该圆的中心是Custom Control小红色矩形这是从User Control衍生Form1的也由GDI+用几种颜色绘制的位图的BackgroundImage属性。如何用鼠标在.NET Framework中移动由GDI绘制的圆?

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

我的问题是如何移动对应于红色矩形的圆圈(圆心)。 我启用了双缓冲来解决闪烁问题。 CircleCenterCustom 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生产的进行? 我GOOGLE了几个网站,并没有得到满意的答案。希望你能给我一些提示,Thx!

回答

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

什么办法,我知道它看起来像一个圆形绘图这样一个简单的任务很长!这里是上面代码的丑陋单行版本:

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

它的工作原理!感谢您的优秀回答! – viperchaos

+0

不客气,不要忘记标记为答案。 – 2011-11-26 09:46:03

0

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

这可以通过简单地绘制矩形来获得Graphics对象的对象的颜色来完成(尽管您没有提及它,我认为GObject是一个Graphics对象,获得了一些双赢控件?) 。

因此,像:

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

我认为重置整个GObject会消耗太多资源并影响窗体的响应时间。 – viperchaos

+0

我假设你将用鼠标移动控件,在这种情况下,以前绘制的_Paint事件将被留下(因为表单没有完全重绘,你需要照顾它,这就是为什么你需要绘制一个矩形,其大小与先前相同的背景颜色,然后在其上绘制圆形。 –

+0

是的,GObject是一个Graphics对象,从Form1获得。我找不到'DrawFilledRectangle'.Is it意思是'FillRectangle'? – viperchaos