我想通过鼠标e.X
和e.Y
进行绘制。我知道我应该使用list<Point>
,但我不知道该怎么做。不幸的是我遇到drawlines
的问题,我不能这样做。
有人告诉我,我应该使用drawlines
而不是Fillellipse
。
这是我当前图纸和我想要做的图纸的图片:
drawing http://img.fileup.cz/?di=1413056646794
以下是代码:
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (action2)
{
stetec = new SolidBrush(lbl_color.BackColor);
Graphics kp = panel1.CreateGraphics();
kp.FillEllipse(stetec, e.X, e.Y, 14, 14);
kp.Dispose();
}
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
action2 = false;
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
action2 = true;
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
}
答案 0 :(得分:14)
因此,首先,不要直接在MouseMove处理程序中执行绘图。将所有绘图代码保留在OnPaint覆盖中,并使用提供的图形对象。只需在MouseMove处理程序中维护一组点。原因(一个原因)是OnPaint将被无法预测地调用,你的绘图将被删除,因为逻辑不会在OnPaint中执行。尝试最小化窗口并再次最大化以查看我的意思。
至于你的另一个问题,就像我说的那样,只需维护一组Point
个对象。使用接受点集合的Graphcis.DrawLines方法覆盖OnPaint并在那里绘制点。所以你的代码变得像......
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (action2)
{
myPointList.Add( e.Location );
panel1.Invalidate(); //force a repaint
}
}
private void panel1_Paint( object sender, PaintEventArgs e )
{
e.Graphics.DrawLines( Pens.Black, myPointList );
}
我还建议继承Panel(或使用哪个控件)并将绘图逻辑放在那里。在这种情况下,只需覆盖OnPaint
方法,而不是处理Paint
事件。
DrawLines
方法将为您做的事情。如果在MSPaint中快速绘制线条,则可以看到相同的效果。该行不会有精确的计数器跟随鼠标的位置,而是线条会非常锯齿状。
答案 1 :(得分:5)
namespace Drawing
{
public partial class Form1 : Form
{
bool draw = false;
int pX = -1;
int pY = -1;
Bitmap drawing;
public Form1()
{
InitializeComponent();
drawing = new Bitmap(panel1.Width, panel1.Height, panel1.CreateGraphics());
Graphics.FromImage(drawing).Clear(Color.White);
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (draw)
{
Graphics panel = Graphics.FromImage(drawing);
Pen pen = new Pen(Color.Black, 14);
pen.EndCap = LineCap.Round;
pen.StartCap = LineCap.Round;
panel.DrawLine(pen, pX, pY, e.X, e.Y);
panel1.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
}
pX = e.X;
pY = e.Y;
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
draw = true;
pX = e.X;
pY = e.Y;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
draw = false;
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImageUnscaled(drawing, new Point(0, 0));
}
}
}
也发布在我的博客上 - http://techtt.hassantt.com/2011/05/c-draw-on-panel.html