C# GDI+绘图中,如何实现,随着鼠标的移动画矩形线(及时删除原来的矩形框),松开鼠标时显示最后状态下的矩形框?

解决方案 »

  1.   

     bool IsDrawSelect = false;
            Point OldMousePoint;
            Rectangle r;
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                OldMousePoint = e.Location;
                IsDrawSelect = true;
            }        private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (IsDrawSelect)
                {
                    int left_X = (e.X > OldMousePoint.X) ? OldMousePoint.X : e.X;
                    int left_Y = (e.Y > OldMousePoint.Y) ? OldMousePoint.Y : e.Y;
                    int w = Math.Abs(e.X - OldMousePoint.X) + 1;
                    int h = Math.Abs(e.Y - OldMousePoint.Y) + 1;
                    r = new Rectangle(left_X, left_Y, w, h);
                    Graphics g = this.CreateGraphics();
                    g.Clear(this.BackColor);
                    g.DrawRectangle(Pens.Black, r);
                }
            }        private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                IsDrawSelect = false;
            }
      

  2.   

    csdn上好多此类的问题,你搜一下吧
      

  3.   

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            {
                if (_IsClick)
                {
                    // 这样可以将后面画的矩形框刷新掉,也可以使用设置剪裁区
                    pictureBox1.Refresh();
                    // 现在鼠标移动到的位置
                      // x_start与y_start是鼠标落下时的坐标
                    x_temp = e.X;
                    y_temp = e.Y;                Graphics myGraph = pictureBox1.CreateGraphics();
                    Pen myPen = new Pen(Color.Silver);
                    // 处理向右下方框选,否则处理向左上方框选
                    if (x_temp - x_start >= 0)
                    {
                        myGraph.DrawRectangle(myPen, x_start, y_start, x_temp - x_start, y_temp - y_start);
                    }
                    else
                    {
                        myGraph.DrawRectangle(myPen, x_temp, y_temp, x_start - x_temp, y_start - y_temp);
                    }
                }
            }
      

  4.   

    感谢二楼的回答,用g.Clear(this.BackColor)将把底图的内容也去掉了,因为要在底图上作上述操作,请问有好办法吗?
      

  5.   

    这个一两个月前做过,我具体的做法就是使用3个"图层",也就是3个bitmap对象,一个是用来显示的,叫ViewBtm(就是我们看到的),一个是用来给graphics操作的,叫TempBtm,第三个是用来装载之前画的东西的,叫MidBtm,因为就像你说的,防止之前画的内容给Clear掉。
     步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。
    我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]
      

  6.   

    这个一两个月前做过,我具体的做法就是使用3个"图层",也就是3个bitmap对象,一个是用来显示的,叫ViewBtm(就是我们看到的),一个是用来给graphics操作的,叫TempBtm,第三个是用来装载之前画的东西的,叫MidBtm,因为就像你说的,防止之前画的内容给Clear掉。
     步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。
    我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]
      

  7.   


    将g.Clear(this.BackColor)改成 this.Refresh();
    但如果背景图很大,机器不是很快,会有闪的感觉.
      

  8.   

    而且图片很大时,在内存放几个副本的代价太大了
    PS:比如6000*6000的,一张就要占100多M