制作一个坐标控件,用于显示函数曲线。
需要增加一个功能,使用鼠标拖动在图像上绘制一个矩形框,然后调整坐标,显示矩形框中的内容(相当于放大图像命令)。现在遇到绘制矩形框的问题。
1.在MouseMove中如果使用重绘命令会降低代码效率。
2.请问能否使用EndContainer与StatContainer提高代码效率;具体使用方法?
3.现使用一个ImageTemp,利用DrawImage来提高重绘效率,但是DrawImage()方法不起作用。下面为简化代码,请速回复。Bitmap bmp = new Bitmap(250, 250);
Graphics g = Graphics.FromImage((Image)bmp);
//将bmp先绘制简单的坐标线
g.Clear(Color.White);
for (int i = 0; i < 250; i += 25)
{
    g.DrawLine(Pens .Red , 0, i, 250, i);
    g.DrawLine(Pens .Red , i, 0, i, 250);
}
pictureBox1.Image=(Image)bmp;
//鼠标左键按下
 void pictureBox1_MouseDown(object sender, MouseEventArgs e)
 {
     if (e.Button == MouseButtons.Left && !viewEnable)
     {
         ImageTemp = (Image)bmp;           //将当前图像保存至ImageTemp中
         viewEnable = true;                //矩形拖动启动
         xTemp = e.X;                      //记录鼠标点击的X与Y值
         yTemp = e.Y;
     }
}
//鼠标左键弹起
void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && viewEnable)
    {
        viewEnable = false;                 //矩形拖动结束
    }
}
//鼠标移动
void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (viewEnable)                        //在矩形拖动情况下
    {
        g.Clear(Color.White)               //清理图像 
        g.DrawImage(ImageTemp,0,0);        //将ImageTemp绘制进g    注:发现此行未起作用
        g.DrawRectangle(Pens.Black, xTemp, yTemp, e.X - xTemp, e.Y - yTemp);    //绘制图像
        pictureBox1.Image = (Image)bmp;    //显示图像
    }
}

解决方案 »

  1.   

    楼主,你的思路是错的,MouseMove的时候不应该矩形画在bmp上,也不要往bmp上画任何东西。
    而是先把你的bmp画到控件上,再将矩形画到控件上,就是将图片不断地刷新控件,然后再画上矩形。
    mouseup的时候再将矩形画在bmp上,然后将bmp画在控件上,这个时候就不用再将矩形画到控件上了。
    不知道楼主明白没?
      

  2.   

    画橡皮线:    public partial class Form1 : Form
        {
            Point startPoint;
            Rectangle lastRect;
            bool isDragging;        public Form1()
            {
                InitializeComponent();
            }        protected override void OnMouseDown(MouseEventArgs e)
            {
                startPoint = this.PointToScreen(e.Location);
                lastRect = new Rectangle(0, 0, 0, 0);
                isDragging = true;
            }
            protected override void OnMouseMove(MouseEventArgs e)
            {
                if (isDragging )
                {
                    Point current = this.PointToScreen(e.Location);
                    int width = current.X - startPoint.X;
                    int height = current.Y - startPoint.Y;                ControlPaint.DrawReversibleFrame(lastRect, this.BackColor, FrameStyle.Dashed);
                    lastRect = new Rectangle(startPoint, new Size(width, height));
                    ControlPaint.DrawReversibleFrame(lastRect, this.BackColor, FrameStyle.Dashed);
                }
            }
            protected override void OnMouseUp(MouseEventArgs e)
            {
                if (isDragging)
                {
                    isDragging = false;
                    ControlPaint.DrawReversibleFrame(lastRect, this.BackColor, FrameStyle.Dashed);
                }
            }
        }
    http://topic.csdn.net/u/20080514/11/fbf074b6-a30f-4741-8e70-1abfd1158ac2.html