我想用鼠标画e.X和e.Y.我知道我应该使用,list<Point>但我不知道该怎么做.不幸的是我有问题drawlines,我做不到.
有人告诉我,我应该使用drawlines而不是Fillellipse.
这是我当前绘图和我想要做的绘图的图片:
绘图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)
{
}
Run Code Online (Sandbox Code Playgroud)
Ed *_* S. 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 );
}
Run Code Online (Sandbox Code Playgroud)
我还建议继承Panel(或者你使用哪个控件)并将绘图逻辑放在那里.在这种情况下,只需覆盖OnPaint方法而不是处理Paint事件.
编辑:我认为我还应该评论为什么你的代码不起作用.对于鼠标遍历的每个像素,您不会收到MouseMove事件.操作系统根本没有给你那么高的分辨率.相反,您将每隔一段时间获得一次活动.您可以在省略号之间的间隙中看到此清单.您需要在每个点之间连接一条线,这就是该DrawLines方法将为您做的事情.如果在MSPaint中快速绘制线条,则可以看到相同的效果.该行不会有精确的计数器跟随鼠标的位置,而是线条将非常锯齿状.
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
也发布在我的博客上 - http://techtt.hassantt.com/2011/05/c-draw-on-panel.html
| 归档时间: |
|
| 查看次数: |
14259 次 |
| 最近记录: |