gpt4 book ai didi

c#鼠标绘图

转载 作者:太空狗 更新时间:2023-10-29 22:07:34 25 4
gpt4 key购买 nike

我想用鼠标画 e.Xe.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)
{


}

最佳答案

因此,首先,不要直接在 MouseMove 处理程序中执行绘图。将所有绘图代码保留在 OnPaint 覆盖中,并在那里使用提供的图形对象。只需在 MouseMove 处理程序中维护一组点。这样做的原因(好吧,一个原因)是 OnPaint 将被不可预测地调用并且你的绘图将被清除,因为逻辑不会在 OnPaint 内执行。尝试最小化您的窗口并再次最大化它以了解我的意思。

至于你的其他问题,正如我所说,只需维护一个 Point 对象的集合。覆盖 OnPaint 并使用 Graphcis.DrawLines 绘制点接受点集合的方法。所以你的代码变成了...

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 事件。

编辑:我认为我还应该评论为什么您的代码不起作用。对于鼠标经过的每个像素,您不会收到 MouseMove 事件。操作系统根本无法为您提供那种级别的分辨率。相反,您会每隔一段时间收到一次事件。您可以在省略号之间的空隙中看到这一点。您需要在每个点之间连接一条线,这是 DrawLines 方法将为您做的。如果您在 MSPaint 中非常快速地绘制一条线,您会看到相同的效果。这条线不会有很好的计数器来准确地跟随鼠标所在的位置,而是这条线会非常参差不齐。

关于c#鼠标绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com