C# 如何删除图片框上绘制的所有矩形?(图片上没有)
我已尝试使用以下代码:C# 如何删除图片框上绘制的所有矩形?(图片上没有),c#,picturebox,system.drawing,drawrectangle,C#,Picturebox,System.drawing,Drawrectangle,我已尝试使用以下代码: pictureBox1.Invalidate(); //or pictureBox1.Update(); //or Refresh(); 但它什么也没做。我想清除图片框中所有绘制的图形,因为单击下一页后,我想在其上绘制新的矩形。所以,请不要向我提供这样的解决方案: g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pictureBox1.
pictureBox1.Invalidate();
//or
pictureBox1.Update();
//or
Refresh();
但它什么也没做。我想清除图片框中所有绘制的图形,因为单击下一页后,我想在其上绘制新的矩形。所以,请不要向我提供这样的解决方案:
g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height))
或
有人想和我分享解决方案吗?我很感激
表格2.cs
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Color.Red, 2);
e.Graphics.DrawRectangle(pen, rect);
}
bool draw;
int x_start, y_start;
Rectangle rect;
//UserRect rect;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
}
else if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
pictureBox1.Cursor = Cursors.Cross;
draw = true;
x_start = e.X;
y_start = e.Y;
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
}else if(e.Button == MouseButtons.Right)
{
pictureBox1.Cursor = Cursors.Cross;
}
if (!draw) return;
LocalMousePosition = pictureBox1.PointToClient(Cursor.Position);
int x = Math.Min(x_start, LocalMousePosition.X);
int y = Math.Min(y_start, LocalMousePosition.Y);
int width = Math.Max(x_start, LocalMousePosition.X) - Math.Min(x_start, LocalMousePosition.X);
int height = Math.Max(y_start, LocalMousePosition.Y) - Math.Min(y_start, LocalMousePosition.Y);
rect = new Rectangle(x, y, width, height);
xx = x;
yy = y;
ww = width;
hh = height;
Refresh();
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
//pictureBox1.Cursor = Cursors.Default;
draw = false;
rectang = new UserRect(rect);
rect = new Rectangle(e.X, e.Y, 0, 0);
rectang.SetPictureBox(this.pictureBox1);
}
else if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
pictureBox1.Cursor = Cursors.Default;
_tracking = false;
}
}
UserRect.cs
public void Draw(Graphics g)
{
g.DrawRectangle(new Pen(Color.Green), rect);
foreach (PosSizableRect pos in Enum.GetValues(typeof(PosSizableRect)))
{
g.DrawRectangle(new Pen(Color.Red), GetRect(pos));
}
}
public void SetPictureBox(PictureBox p)
{
this.mPictureBox = p;
mPictureBox.MouseDown += new MouseEventHandler(mPictureBox_MouseDown);
mPictureBox.MouseUp += new MouseEventHandler(mPictureBox_MouseUp);
mPictureBox.MouseMove += new MouseEventHandler(mPictureBox_MouseMove);
mPictureBox.Paint += new PaintEventHandler(mPictureBox_Paint);
}
private void mPictureBox_Paint(object sender, PaintEventArgs e)
{
try
{
Draw(e.Graphics);
}
catch (Exception exp)
{
System.Console.WriteLine(exp.Message);
}
}
private void mPictureBox_MouseDown(object sender, MouseEventArgs e)
{
mIsClick = true;
nodeSelected = PosSizableRect.None;
nodeSelected = GetNodeSelectable(e.Location);
if (rect.Contains(new Point(e.X, e.Y)))
{
mMove = true;
}
oldX = e.X;
oldY = e.Y;
}
private void mPictureBox_MouseUp(object sender, MouseEventArgs e)
{
//MessageBox.Show(rect.ToString());
mIsClick = false;
mMove = false;
}
private void mPictureBox_MouseMove(object sender, MouseEventArgs e)
{
ChangeCursor(e.Location);
if (mIsClick == false)
{
return;
}
Rectangle backupRect = rect;
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
switch (nodeSelected)
{
case PosSizableRect.LeftUp:
rect.X += e.X - oldX;
rect.Width -= e.X - oldX;
rect.Y += e.Y - oldY;
rect.Height -= e.Y - oldY;
break;
case PosSizableRect.LeftMiddle:
rect.X += e.X - oldX;
rect.Width -= e.X - oldX;
break;
case PosSizableRect.LeftBottom:
rect.Width -= e.X - oldX;
rect.X += e.X - oldX;
rect.Height += e.Y - oldY;
break;
case PosSizableRect.BottomMiddle:
rect.Height += e.Y - oldY;
break;
case PosSizableRect.RightUp:
rect.Width += e.X - oldX;
rect.Y += e.Y - oldY;
rect.Height -= e.Y - oldY;
break;
case PosSizableRect.RightBottom:
rect.Width += e.X - oldX;
rect.Height += e.Y - oldY;
break;
case PosSizableRect.RightMiddle:
rect.Width += e.X - oldX;
break;
case PosSizableRect.UpMiddle:
rect.Y += e.Y - oldY;
rect.Height -= e.Y - oldY;
break;
default:
if (mMove)
{
rect.X = rect.X + e.X - oldX;
rect.Y = rect.Y + e.Y - oldY;
}
break;
}
}
oldX = e.X;
oldY = e.Y;
if (rect.Width < 5 || rect.Height < 5)
{
rect = backupRect;
}
TestIfRectInsideArea();
mPictureBox.Invalidate();
}
public void Draw(图形g)
{
g、 DrawRectangle(新笔(绿色),矩形);
foreach(Enum.GetValues中的PosSizableRect pos(typeof(PosSizableRect)))
{
g、 DrawRectangle(新笔(红色)、GetRect(pos));
}
}
公共无效设置PictureBox(PictureBox p)
{
这个.mpiturebox=p;
mpicurebox.MouseDown+=新的MouseEventHandler(mpicurebox\u MouseDown);
mpicurebox.MouseUp+=新的MouseEventHandler(mpicurebox_MouseUp);
mpicurebox.MouseMove+=新的MouseEventHandler(mpicurebox\u MouseMove);
mpicurebox.Paint+=新的PaintEventHandler(mpicurebox_-Paint);
}
私有void mPictureBox_Paint(对象发送方,PaintEventArgs e)
{
尝试
{
绘画(如图形);
}
捕获(异常扩展)
{
System.Console.WriteLine(exp.Message);
}
}
私有void mPictureBox_MouseDown(对象发送方,MouseEventArgs e)
{
mIsClick=true;
nodeSelected=PosSizableRect.None;
nodeSelected=GetNodeSelectable(如位置);
if(矩形包含(新点(e.X,e.Y)))
{
mMove=true;
}
oldX=e.X;
oldY=e.Y;
}
私有void mPictureBox_MouseUp(对象发送方,MouseEventArgs e)
{
//Show(rect.ToString());
mIsClick=false;
mMove=false;
}
私有void mPictureBox_MouseMove(对象发送方,MouseEventArgs e)
{
更改光标(例如位置);
if(mIsClick==false)
{
返回;
}
矩形backupRect=rect;
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
开关(已选择节点)
{
case PosSizableRect.LeftUp:
rect.X+=e.X-oldX;
矩形宽度-=e.X-旧X;
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
大小写可能为Rect.LeftMiddle:
rect.X+=e.X-oldX;
矩形宽度-=e.X-旧X;
打破
case PosSizableRect.LeftBottom:
矩形宽度-=e.X-旧X;
rect.X+=e.X-oldX;
垂直高度+=e.Y-旧的;
打破
case possizableCrect.BottomMiddle:
垂直高度+=e.Y-旧的;
打破
case possizableCrect.RightUp:
矩形宽度+=e.X-oldX;
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
case PosSizableRect.RightBottom:
矩形宽度+=e.X-oldX;
垂直高度+=e.Y-旧的;
打破
大小写可能为Rect.RightMiddle:
矩形宽度+=e.X-oldX;
打破
大小写可能为rect.UpMiddle:
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
违约:
如果(mMove)
{
rect.X=rect.X+e.X-oldX;
rect.Y=rect.Y+e.Y-oldY;
}
打破
}
}
oldX=e.X;
oldY=e.Y;
if(直线宽度<5 | |直线高度<5)
{
rect=backupRect;
}
Testifrectinidearea();
mpicurebox.Invalidate();
}
通常,我会在“绘制事件”(用于交互式绘制,如选择框和鼠标移动相关内容)和单独的参考底图图像之间分割图形
这有几个原因,例如对要绘制的内容的控制(假设您只想绘制重角1、3和5,如果未选中某个复选框,则绘制所有1到6,如果选中),以及性能(具有大量数据)。
你可以用油漆做所有这些,但它会膨胀。与此相反,您可以将绘图任务拆分为多个函数,这对于大型绘图非常方便
非常简单的示例-VB.NET:
Dim UnderlayingImage as Image
UnderLayingImage = New Bitmap(Me.PictureBox1.Width, Me.Picturebox1.Height)
Dim g As Graphics = Graphics.FromImage(UnderLayingImage)
Dim bgBrush As SolidBrush = New SolidBrush(Color.LightSlateGray)
Dim bgBrushWhite As SolidBrush = New SolidBrush(Color.White)
Dim shPen As Pen = New Pen(Color.Black)
Dim rect As RectangleF = New RectangleF(50, 50, 100, 100)
g.FillRectangle(bgBrush, rect)
g.DrawRectangle(Pens.Black, Rectangle.Round(rect))
Me.PictureBoxDrawing.Image = UnderLayingImage
翻译成C#:
回到你的问题:这样你就不会清除你的画,但是你重新画了它,在这个过程中,你决定要包括什么和要添加什么 你需要给我们看更多的代码。
g
是来自Paint
事件e.Graphics
,还是来自Graphics.FromImage(bmp)
。后者将持久地绘制到位图中。前者将绘制事件中的所有数据绘制到控件上。如果您从例如一个List
中绘制,您需要做的就是清除该列表,然后Invalidate
pbox..rect=Rectangle.Empty and Invalidate()强制重新绘制是一种简单的方法。
Dim UnderlayingImage as Image
UnderLayingImage = New Bitmap(Me.PictureBox1.Width, Me.Picturebox1.Height)
Dim g As Graphics = Graphics.FromImage(UnderLayingImage)
Dim bgBrush As SolidBrush = New SolidBrush(Color.LightSlateGray)
Dim bgBrushWhite As SolidBrush = New SolidBrush(Color.White)
Dim shPen As Pen = New Pen(Color.Black)
Dim rect As RectangleF = New RectangleF(50, 50, 100, 100)
g.FillRectangle(bgBrush, rect)
g.DrawRectangle(Pens.Black, Rectangle.Round(rect))
Me.PictureBoxDrawing.Image = UnderLayingImage
Image UnderlayingImage;
UnderLayingImage = new Bitmap(this.PictureBox1.Width, this.Picturebox1.Height);
Graphics g = Graphics.FromImage(UnderLayingImage);
SolidBrush bgBrush = new SolidBrush(Color.LightSlateGray);
SolidBrush bgBrushWhite = new SolidBrush(Color.White);
Pen shPen = new Pen(Color.Black);
RectangleF rect = new RectangleF(50, 50, 100, 100);
g.FillRectangle(bgBrush, rect);
g.DrawRectangle(Pens.Black, Rectangle.Round(rect));
this.PictureBoxDrawing.Image = UnderLayingImage;