C# GDI+绘图中,如何实现,随着鼠标的移动画矩形线,松开鼠标时显示最后状态下的矩形框? C# GDI+绘图中,如何实现,随着鼠标的移动画矩形线(及时删除原来的矩形框),松开鼠标时显示最后状态下的矩形框? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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; } csdn上好多此类的问题,你搜一下吧 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); } } } 感谢二楼的回答,用g.Clear(this.BackColor)将把底图的内容也去掉了,因为要在底图上作上述操作,请问有好办法吗? 这个一两个月前做过,我具体的做法就是使用3个"图层",也就是3个bitmap对象,一个是用来显示的,叫ViewBtm(就是我们看到的),一个是用来给graphics操作的,叫TempBtm,第三个是用来装载之前画的东西的,叫MidBtm,因为就像你说的,防止之前画的内容给Clear掉。 步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]。 这个一两个月前做过,我具体的做法就是使用3个"图层",也就是3个bitmap对象,一个是用来显示的,叫ViewBtm(就是我们看到的),一个是用来给graphics操作的,叫TempBtm,第三个是用来装载之前画的东西的,叫MidBtm,因为就像你说的,防止之前画的内容给Clear掉。 步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]。 将g.Clear(this.BackColor)改成 this.Refresh();但如果背景图很大,机器不是很快,会有闪的感觉. 而且图片很大时,在内存放几个副本的代价太大了PS:比如6000*6000的,一张就要占100多M WebClient下载文件后。。。 iis无法访问虚拟目录下的文件 求助一个算法小程序 如何实现快速启动 求WinForm中的特殊窗体效果源代码 在【CSDN】中找≮师傅≯一名!愿意的看我简历 我现在很迷茫,请各们有经验的高手对在下提点建议! 不胜感激!!! 在 WinForm 中. 怎么选中 DataGrid 控件中. 某一单元格 Process.HasExited 总是返回false 自动生成lable和TextBox的排版问题 调用google地图? 如何获得上传文件的大小?
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;
}
{
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);
}
}
}
步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。
我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]。
步骤是:graphics在TempBtm上操作,MouseMove()中不断画,不断擦除,放开鼠标后,就将内容输出到ViewBtm,下次按下鼠标画是,先将ViewBtm的内容复制到MidBtm,然后又对TempBtm进行操作,松开鼠标后又将内容输出到ViewBtm。
我可能说得不清楚,反正就是为了跟2楼差不多,但为了防止之前的内容给擦掉,你应该没此鼠标移动,那个举行和之前所画的东西都要全部输出出来。我有一个类,你有兴趣要就给我发EMAIL:[email protected]。
将g.Clear(this.BackColor)改成 this.Refresh();
但如果背景图很大,机器不是很快,会有闪的感觉.
PS:比如6000*6000的,一张就要占100多M