制作一个坐标控件,用于显示函数曲线。
需要增加一个功能,使用鼠标拖动在图像上绘制一个矩形框,然后调整坐标,显示矩形框中的内容(相当于放大图像命令)。现在遇到绘制矩形框的问题。
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中如果使用重绘命令会降低代码效率。
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; //显示图像
}
}
而是先把你的bmp画到控件上,再将矩形画到控件上,就是将图片不断地刷新控件,然后再画上矩形。
mouseup的时候再将矩形画在bmp上,然后将bmp画在控件上,这个时候就不用再将矩形画到控件上了。
不知道楼主明白没?
{
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