如何使用最近的鼠标位置重绘单个椭圆

时间:2013-04-16 02:42:34

标签: c# graphics paint mousemove mousedown

我希望在MouseMove()事件期间在屏幕上绘制一个椭圆,但我希望它只能将最近的椭圆从起点绘制到当前鼠标位置。目前它为每个正在注册的鼠标位置绘制一个椭圆。如果我只使用MouseDown()和MouseUp()事件,我可以很容易地绘制它而不显示椭圆,但我希望用户能够在移动鼠标时看到椭圆,这样他们就可以确切地知道他们放置它的位置。有谁知道我怎么能做到这一点?

我目前的代码如下:

private void pnlDraw_MouseDown(object sender, MouseEventArgs e)
{
    initialX = e.X;
    initialY = e.Y;
    previousX = e.X;
    previousY = e.Y;
    isPainting = true;
}

private void pnlDraw_MouseMove(object sender, MouseEventArgs e)
{
    if (isPainting)
    {
        switch (currentDrawType)
        {

            case DRAWTYPE.ELLIPSE:
            {
                DrawEllipse(e);
                break;
            }
            default:
            {
                break;
            }
        }
    }
}

private void DrawEllipse(MouseEventArgs e)
{
    pen = new Pen(Color.Black);
    Graphics graphics = pnlDraw.CreateGraphics();
    graphics.DrawEllipse(pen, initialX, initialY, e.X - initialX, e.Y - initialY);

    previousX = e.X;
    previousY = e.Y;
    graphics.Dispose();
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

当您在屏幕上绘制内容时,您应该做的第一件事是清除之前显示的内容。否则,您只需在现有图纸上绘制。

在WinForm中,它通常采用OnBackgroundPaint()方法处理,这是一种简单的方式,说明它应该清除背景。

看起来应该是这样的:

e.Graphics.FillRectangle(new SolidBrush(MyBackgroundColor), e.ClipRectangle);

或者如果它不是绘图事件:

graphics.FillRectangle(new SolidBrush(MyBackgroundColor), 0, 0, MyWidth, MyHeight);

在绘制任何东西之前应该调用它。 保证您的绘图区域可以在其上绘制,这也是一种保证。