我正在制作一个图形编辑器,但是我遇到了一些问题。放弃Panel
。 Ellipse没有采取我丢弃它的确切位置,我认为它放在大小为150; 150的UserControl中。这是一个简短电影的链接来说明我的意思:http://gyazo.com/abf5484a31e2d1ce8ebccc49bee9fdb6在第一部分你可以看到椭圆走到错误的位置,当我画一条线时,在电影的结尾看似椭圆周围有一块。我该如何解决这个问题?
Form1.cs的
public partial class Form1 : Form
{
bool draw = false;
int x, y, xe, ye;
public Form1()
{
InitializeComponent();
menuComboBoxShape.ComboBox.DataSource = Enum.GetValues(typeof(Item));
}
public enum Item
{
Pencil,
Rectangle,
Ellipse,
}
private void panel_MouseDown(object sender, MouseEventArgs e)
{
draw = true;
x = e.X;
y = e.Y;
}
private void panel_MouseUp(object sender, MouseEventArgs e)
{
draw = false;
xe = e.X;
ye = e.Y;
Item item;
Enum.TryParse<Item>(menuComboBoxShape.ComboBox.SelectedValue.ToString(), out item);
switch (item)
{
case Item.Pencil:
using (Graphics g = panel.CreateGraphics())
using (var pen = new Pen(System.Drawing.Color.Black)) //Create the pen used to draw the line (using statement makes sure the pen is disposed)
{
g.DrawLine(pen,new Point(x, y), new Point(xe, ye));
}
break;
case Item.Rectangle:
RectangleShape recShape = new RectangleShape(x, y, xe - x, ye - y);
panel.Controls.Add(recShape);
panel.Invalidate();
break;
case Item.Ellipse:
EllipseShapeTest test = new EllipseShapeTest(x, y, xe - x, ye - y);
panel.Controls.Add(test);
panel.Invalidate();
break;
default:
break;
}
}
}
EllipseShapeTest.cs
class EllipseShapeTest : UserControl
{
private int x;
private int y;
private int width;
private int height;
public EllipseShapeTest(int x, int y, int width, int height)
{
setY(y);
setX(x);
setWidth(width);
setHeight(height);
}
public int getX() { return x;}
public int getY() { return y; }
public int getWidth() { return width; }
public int getHeight() { return height; }
public void setX(int newx) { x = newx; }
public void setY(int newy) { y = newy; }
public void setWidth(int newwidth) { width = newwidth; }
public void setHeight(int newheight) { height = newheight; }
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// Call methods of the System.Drawing.Graphics object.
// Draw an aqua rectangle in the rectangle represented by the control.
e.Graphics.DrawEllipse(Pens.Aqua,x,y,width,height);
}
protected override void OnMouseMove(MouseEventArgs e)
{
// Make the cursor the Hand cursor when the mouse moves
// over the button.
Cursor = Cursors.Hand;
// Call MyBase.OnMouseMove to activate the delegate.
base.OnMouseMove(e);
if (e.Button == MouseButtons.Left)
{
this.Location = new Point(e.X, e.Y);
Invalidate();
}
}
答案 0 :(得分:0)
这是一个可拖动的Label
子类。相同的代码应该适用于任何控件,包括UserControl
。
public DragLabel()
{
//..
MouseDown += DragLabel_MouseDown;
MouseMove += DragLabel_MouseMove;
}
Point mDown { get; set; }
void DragLabel_MouseDown(object sender, MouseEventArgs e)
{
mDown = e.Location;
}
void DragLabel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Location = new Point(e.X + Left - mDown.X, e.Y + Top - mDown.Y);
}
}
如果您的应用程序需要使多个类可拖动,您可以将功能放在DragController
类中并注册那些需要它的控件。
至于你的第二个问题:在这个例子中我们只看到一个控件。在这个简单的情况下,应该做UC的BackColor = Color.Transparent
。但是一旦你想添加更多这样的形状,你就会撞墙而且,我担心,你必须放弃这样的一个设计。有关问题和我建议的解决方案的讨论,请参阅here。
BTW:在活动形状周围使用Control
到移动很好,但所有其他形状必须是Drawn
到背景。 (在完全理解最后一段之后,这更有意义; - )