所以我最近一直在努力制作一个用于练习C#的绘画应用程序。 我过去2天的问题是创建矩形。
我制作了一个面板,所以所有的绘图都在那里。用户使用菜单选择他想要绘制的形状,他可以用鼠标开始绘图。
我遇到以下两个问题:
1)即使我的起点位于面板内部,我移动鼠标并走到面板外面,矩形被绘制在面板外面,如下图所示。
2)创建此矩形后,我尝试绘制另一个矩形,删除前一个矩形。所以在某种程度上我无法一次绘制2个矩形。
这是我的源代码的一部分。
Graphics mygraphics;
Pen lPen = new Pen(Color.Black); //Left Pen
Pen rPen = new Pen(Color.White); //Right pen
Point sp = new Point(0, 0);
private bool isRectangle;
private bool isLeft, isRight; //isLeft -- Left Click, isRight -- Right Click
private void drawPanel_MouseMove(object sender, MouseEventArgs e)
{
if (isRectangle == true)
{
if (e.Button == MouseButtons.Left)
{
isLeft = true;
Point p = e.Location;
int x = Math.Min(sp.X, p.X);
int y = Math.Min(sp.Y, p.Y);
int w = Math.Abs(p.X - sp.X);
int h = Math.Abs(p.Y - sp.Y);
mRect = new Rectangle(x, y, w, h);
this.Invalidate();
}
}
}
private void drawPanel_MouseDown(object sender, MouseEventArgs e)
{
sp = e.Location;
}
private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
isLeft = false;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawRectangle(lPen, mRect);
}
我想要完成的是在我尝试绘制另一个并在面板中绘制它们之后,我的矩形没有被删除。
你们有什么建议?
答案 0 :(得分:0)
以下是我建议的最小变化:
List<Rectangle> rectangles = new List<Rectangle>();
Rectangle mRect = Rectangle.Empty;
private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
isLeft = false;
rectangles.Add(mRect);
mRect = Rectangle.Empty;
drawPanel.Invalidate();
}
private void drawPanel_Paint(object sender, PaintEventArgs e)
{
foreach (Rectangle rect in rectangles) e.Graphics.DrawRectangle(lPen, rect );
e.Graphics.DrawRectangle(Pens.Orange, mRect); // or whatever..
}
请注意,Paint
事件现在是Panel
之一。请确保hook it up
使用Panel
!!
另请注意我如何以与其他矩形列表不同的颜色绘制当前矩形mRect
;这当然是可选的..