1

我正在尝试在 mousemove 事件上围绕图片框拖动形状,但我正在努力让它顺利移动。图片框加载了一个图像作为背景,我希望图形对象在单击并拖动鼠标时在图像顶部拖动一个圆圈。

我通过在每次鼠标移动并重新加载图片框时创建原始图像的克隆来使其工作,但似乎它们必须是实现这一目标的更好方法。

每次添加的任何图形都保留在图像上时,无需重新加载原始位图,从而创建更像绘画应用程序的轨迹。

如何清除以前的图纸而不每次都重新加载整个图像?任何帮助表示赞赏。

private void picCanvas_MouseMove(object sender, MouseEventArgs e)
{
    if (_drag)
    {
        picCanvas.Image = (Bitmap)_original.Clone();
        Graphics g = Graphics.FromImage((Bitmap)picCanvas.Image);
        g.DrawEllipse(_whitePen, e.X, e.Y, 10, 10);
        picCanvas.Invalidate();
    }
}

private void picCanvas_MouseDown(object sender, MouseEventArgs e)
{
    _drag = true;
}

private void picCanvas_MouseUp(object sender, MouseEventArgs e)
{
    _drag = false;
}
4

3 回答 3

3

检查这个样本它更简单

//Load Image
Bitmap TestImage = new Bitmap(FileName);
//Create Graphics Object
Graphics g = Graphics.FromImage(TestImage);                   
g.DrawEllipse(new Pen(Color.Red), i, j,0.5F, 0.5F);
//View Your Results
pictureBox1.Image = TestImage;
于 2012-10-08T19:14:18.783 回答
0

要以最佳方式解决问题,请使用picCanvas.Paint事件。在 mousemove 事件中设置位置并使用该位置在绘图事件中绘制。

    Point pos = Point.Empty;// or your initial position

    private void picCanvas_MouseMove(object sender, MouseEventArgs e)
    {
        if (_drag)
        {
            pos = e.Location;
        }
    }
    private void picCanvas_Paint(object sender, PaintEventArgs e)
    {
        if (_drag)
        {
            Graphics g = e.Graphics;//The event handler sends us the graphics object to use for painting
            g.DrawEllipse(_whitePen, pos.X, pos.Y, 10, 10); 
        }
    }

您应该将 Paint 事件添加到 Control 并在 formload 或一些初始化函数中设置图像。

picCanvas.Image = (Bitmap)_original.Clone(); 
于 2011-02-02T09:33:52.167 回答
0

使用来自 Honibis 的上述答案,我最终得到了这个。

加载图片并使图片无效导致刷新

picCanvas.Image = image;
picCanvas.Invalidate()

然后在油漆事件中

private void picCanvas_Paint(object sender, PaintEventArgs e)
{
  if (_drag)         
  {
    using (Pen pen = new Pen(Color.White, 2))
    {
      e.Graphics.DrawEllipse(pen, pos.X, pos.Y, 10, 10);
    }
  }
}
于 2011-02-02T10:54:17.703 回答