【问题标题】:How to redraw a single ellipse with most recent mouse position如何用最近的鼠标位置重绘一个椭圆
【发布时间】:2013-04-16 02:42:33
【问题描述】:

我希望在 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();
}

任何帮助将不胜感激!

【问题讨论】:

  • 你是说它在每次调用 MouseMove 时都绘制椭圆,但不会在下一次调用时擦除它?
  • 是的,就是这样!

标签: c# graphics paint mousemove mousedown


【解决方案1】:

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

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

应该是这样的:

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

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

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

并且应该在它上面绘制任何东西之前被调用。 这也是您的绘图区已准备好在其上绘制的保证。

【讨论】:

  • 好的,所以我需要保存到目前为止的每个绘制点,然后在每个事件上重新绘制它们?然后我可以简单地删除我不想绘制的保存点?
  • 那个,或者您可以将以前的绘图保存为位图,然后重绘作为背景。每个新绘图都会添加到位图中。这取决于您是否希望用户将每个项目作为单独的实体或单个画布访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多