我正在尝试模仿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”。这是尝试获取到目前为止绘制的所有内容并存储它,以便在鼠标拖动发生时,我可以在绘制矩形“预览”之前重绘它。出于某种原因,我不能让位图复制和重新显示,我只是在屏幕上建立所有“预览”矩形,尽管事实上我正在保存旧画布并在每次鼠标移动之间恢复它。
感谢任何帮助。
答案 0 :(得分:0)
我认为发生的事情是pictureBox1
和lastCanvas
在您的pictureBox1_MouseMove
事件处理程序中引用相同的内容。
此代码将图像和lastCanvas设置为内存中的同一对象
pictureBox1.Image = lastCanvas;
当您将图像绘制到您创建的Graphics
对象时,您还要更新lastCanvas。您可能需要Clone
位图。