我使用Form1
在GDI+
上绘制了一些圆圈,圆圈的中心是Custom Control
的一个小红色矩形,来自User Control
,{ {1}} BackgroundImage
'位图的属性,也由Form1
以多种颜色绘制。
我想要的是当我用鼠标移动红色矩形(圆心)时,圆圈也会跟随红色矩形移动。使用GDI+
,MouseDown
事件,我可以使用鼠标平滑移动红色矩形。
我的问题是如何移动与红色矩形(圆心)对应的圆圈。
我启用了双缓冲来解决闪烁问题。 MouseMove
是CircleCenter
类的对象(例如红色矩形)。 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+
所绘制的黑色圆圈?
我搜索了几个网站并没有得到满意的答案。希望你能给我一些提示,谢谢!
答案 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.
应该隐藏旧图纸并在新位置重新绘制圆圈。