1

我正在尝试模仿 MS Paint 中的效果,在绘制形状时,当鼠标按下时,它会在屏幕上“预览”。

很简单:

    private Bitmap lastCanvas;                

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
         lastCanvas = new Bitmap(pictureBox1.image);

         gr = Graphics.FromImage(pictureBox1.Image);

         start = e.Location;
         gr.DrawRectangle(myPen, start.X, start.Y, 0, 0);
         pictureBox1.Refresh();
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {   
        if (e.Button == MouseButtons.Left)
        {
            pictureBox1.Image = lastCanvas;

            gr = Graphics.FromImage(pictureBox1.Image);

            gr.DrawRectangle(myPen, start.X, start.Y, e.Location.X - start.X, e.Location.Y - start.Y);
            pictureBox1.Refresh();
        }
    }

问题是它似乎没有正确存储“lastCanvas”。这是一种尝试将到目前为止绘制的所有内容并存储起来,以便在发生鼠标拖动时,我可以在绘制矩形“预览”之前重新绘制它。由于某种原因,我无法复制和重新显示位图,尽管事实上我正在保存旧画布并在每次鼠标移动之间恢复它,但我只是在屏幕上构建了所​​有“预览”矩形。

任何帮助表示赞赏。

4

1 回答 1

0

我相信正在发生的是,pictureBox1并且在您的事件处理程序lastCanvas中引用了相同的内容。pictureBox1_MouseMove

此代码将 image 和 lastCanvas 设置为内存中的同一对象

pictureBox1.Image = lastCanvas;

当您将图像绘制到Graphics您创建的对象时,您也在更新 lastCanvas。您可能需要Clone位图。

于 2012-10-03T03:57:22.387 回答