绘制矩形的Z-Index C#

时间:2014-02-10 12:25:43

标签: c# picturebox

我有一个应用程序,它使用鼠标在picbox图像上自由绘制一个矩形。然而,矩形只显示在picbox后面,而不是在它的顶部。有没有我可以设置的属性可以解决这个问题? (在picbox图像上显示rect而不是在后面)。这是代码:

   System.Drawing.Graphics picboxGraphics;
    bool mDown = false;
    int mouseX;
    int mouseY;

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        mDown = true;
        mouseX = e.X;
        mouseY = e.Y;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (mDown == true)
        {
            this.Refresh();
            Pen drawPen = new Pen(Color.Red, 5);
            int width = e.X - mouseX, height = e.Y - mouseY;
            Rectangle rect = new Rectangle(mouseX, mouseY, width * Math.Sign(width), height * Math.Sign(height));
            picboxGraphics = this.CreateGraphics();
            picboxGraphics.DrawRectangle(drawPen, rect);
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        mDown = false;
    }

2 个答案:

答案 0 :(得分:0)

您可以从picbox背后的表单创建图形 你可以从picbox的图像创建图形并绘制一些东西。但是如果你想要图层系统,你可以在透明图像上绘制你的图像并将它们组合起来。使用此vay,您可以制作撤消或删除图层系统。

答案 1 :(得分:0)

您的代码中存在几个问题:dispose,全局变量和用于创建图形的错误控件。这样做:

using(var graphics = (sender as Control).CreateGraphics())
    graphics.DrawRectangle(drawPen, rect);

但老实说,你必须以不同的方式组织它(假设你要模仿Paint):

  • 创建新对象(当鼠标关闭时)
  • Paint事件绘图对象(如果有)
  • 在鼠标移动事件期间,更新已编辑的对象属性并调用Invalidate
  • 当您最小化/恢复表单时,该对象仍然存在(在您的示例中,它将丢失)。

您可以支持List个对象存储多个矩形,并将历史记录支持(如TC Alper Tokcan答案建议)添加到至少Undo最后一个对象。