4个回答
展开全部
给你写了个比较全面的
1.有处理重绘区域的,这样闪烁的不是很明显。在你画矩形的过程中,你会发现,你的鼠标经过的距离越大,闪烁越明显。楼上的兄台每次都是更新整个界面,闪烁比较严重。
2.在画矩形的方向上,你可以任意方向绘画,因为我上次的和楼上那位兄台的都只能从左上往右下拉动鼠标绘制矩形。
3.请耐性看代码
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace ReverseArray
{
public partial class Form1 : Form
{
private bool mouseStatus = false;//鼠标状态,false为松开
private List<Rectangle> rectList = new List<Rectangle>();//存储所有画过的矩形
private Point startPoint;//鼠标按下的点
private Point endPoint;//
private Rectangle currRect;//当前正在绘制的举行
private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左右的坐标,这样重绘的效率更高。
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
mouseStatus = true;
startPoint.X = e.X;
startPoint.Y = e.Y;
//重新一个矩形,重置最大重绘矩形的上下左右的坐标
minStartX = e.X;
minStartY = e.Y;
maxEndX = e.X;
maxEndY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseStatus)
{
endPoint.X = e.X; endPoint.Y = e.Y;
//这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只有从左上开始往右下角才能画出矩形。
//这样处理的话,可以任意方向,当然中途可以更换方向。
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
minStartX = Math.Min(minStartX, realStartX);
minStartY = Math.Min(minStartY, realStartY);
maxEndX = Math.Max(maxEndX, realEndX);
maxEndY = Math.Max(maxEndY, realEndY);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
//一下是为了获取最大重绘矩形。
Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
mouseStatus = false;
endPoint.X = e.X; endPoint.Y = e.Y;
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
rectList.Add(currRect);//当前矩形算是被认可了,所以存起来
this.Invalidate();//重绘整个界面
}
private void Form1_Paint(object sender, PaintEventArgs e)//处理重绘情况
{
Graphics g = e.Graphics;
g.Clear(this.BackColor);
g.DrawRectangle(new Pen(Color.Red, 1), currRect);
foreach (Rectangle rect in rectList)
g.DrawRectangle(new Pen(Color.Red, 1), rect);
}
}
}
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
1.有处理重绘区域的,这样闪烁的不是很明显。在你画矩形的过程中,你会发现,你的鼠标经过的距离越大,闪烁越明显。楼上的兄台每次都是更新整个界面,闪烁比较严重。
2.在画矩形的方向上,你可以任意方向绘画,因为我上次的和楼上那位兄台的都只能从左上往右下拉动鼠标绘制矩形。
3.请耐性看代码
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace ReverseArray
{
public partial class Form1 : Form
{
private bool mouseStatus = false;//鼠标状态,false为松开
private List<Rectangle> rectList = new List<Rectangle>();//存储所有画过的矩形
private Point startPoint;//鼠标按下的点
private Point endPoint;//
private Rectangle currRect;//当前正在绘制的举行
private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左右的坐标,这样重绘的效率更高。
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
mouseStatus = true;
startPoint.X = e.X;
startPoint.Y = e.Y;
//重新一个矩形,重置最大重绘矩形的上下左右的坐标
minStartX = e.X;
minStartY = e.Y;
maxEndX = e.X;
maxEndY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseStatus)
{
endPoint.X = e.X; endPoint.Y = e.Y;
//这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只有从左上开始往右下角才能画出矩形。
//这样处理的话,可以任意方向,当然中途可以更换方向。
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
minStartX = Math.Min(minStartX, realStartX);
minStartY = Math.Min(minStartY, realStartY);
maxEndX = Math.Max(maxEndX, realEndX);
maxEndY = Math.Max(maxEndY, realEndY);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
//一下是为了获取最大重绘矩形。
Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
mouseStatus = false;
endPoint.X = e.X; endPoint.Y = e.Y;
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
rectList.Add(currRect);//当前矩形算是被认可了,所以存起来
this.Invalidate();//重绘整个界面
}
private void Form1_Paint(object sender, PaintEventArgs e)//处理重绘情况
{
Graphics g = e.Graphics;
g.Clear(this.BackColor);
g.DrawRectangle(new Pen(Color.Red, 1), currRect);
foreach (Rectangle rect in rectList)
g.DrawRectangle(new Pen(Color.Red, 1), rect);
}
}
}
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
东莞大凡
2024-08-07 广告
2024-08-07 广告
在东莞市大凡光学科技有限公司,我们利用Halcon软件处理机器视觉项目时,会用到自定义标定板以满足特定需求。Halcon支持用户根据实际应用场景自定义标定板形状与标记点。这不仅可以灵活应对不同工作环境,还能提高标定精度。通过调整圆点数量、间...
点击进入详情页
本回答由东莞大凡提供
展开全部
给你写了个比较全面的
1.有处理重绘区域的,这样闪烁的不是很明显。在你画矩形的过程中,你会发现,你的鼠标经过的距离越大,闪烁越明显。楼上的兄台每次都是更新整个界面,闪烁比较严重。
2.在画矩形的方向上,你可以任意方向绘画,因为我上次的和楼上那位兄台的都只能从左上往右下拉动鼠标绘制矩形。
3.请耐性看代码
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace ReverseArray
{
public partial class Form1 : Form
{
private bool mouseStatus = false;//鼠标状态,false为松开
private List<Rectangle> rectList = new List<Rectangle>();//存储所有画过的矩形
private Point startPoint;//鼠标按下的点
private Point endPoint;//
private Rectangle currRect;//当前正在绘制的举行
private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左右的坐标,这样重绘的效率更高。
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
mouseStatus = true;
startPoint.X = e.X;
startPoint.Y = e.Y;
//重新一个矩形,重置最大重绘矩形的上下左右的坐标
minStartX = e.X;
minStartY = e.Y;
maxEndX = e.X;
maxEndY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseStatus)
{
endPoint.X = e.X; endPoint.Y = e.Y;
//这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只有从左上开始往右下角才能画出矩形。
//这样处理的话,可以任意方向,当然中途可以更换方向。
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
minStartX = Math.Min(minStartX, realStartX);
minStartY = Math.Min(minStartY, realStartY);
maxEndX = Math.Max(maxEndX, realEndX);
maxEndY = Math.Max(maxEndY, realEndY);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
//一下是为了获取最大重绘矩形。
Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
mouseStatus = false;
endPoint.X = e.X; endPoint.Y = e.Y;
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
rectList.Add(currRect);//当前矩形算是被认可了,所以存起来
this.Invalidate();//重绘整个界面
}
private void Form1_Paint(object sender, PaintEventArgs e)//处理重绘情况
{
Graphics g = e.Graphics;
g.Clear(this.BackColor);
g.DrawRectangle(new Pen(Color.Red, 1), currRect);
foreach (Rectangle rect in rectList)
g.DrawRectangle(new Pen(Color.Red, 1), rect);
}
}
}
希望对你有帮助
1.有处理重绘区域的,这样闪烁的不是很明显。在你画矩形的过程中,你会发现,你的鼠标经过的距离越大,闪烁越明显。楼上的兄台每次都是更新整个界面,闪烁比较严重。
2.在画矩形的方向上,你可以任意方向绘画,因为我上次的和楼上那位兄台的都只能从左上往右下拉动鼠标绘制矩形。
3.请耐性看代码
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace ReverseArray
{
public partial class Form1 : Form
{
private bool mouseStatus = false;//鼠标状态,false为松开
private List<Rectangle> rectList = new List<Rectangle>();//存储所有画过的矩形
private Point startPoint;//鼠标按下的点
private Point endPoint;//
private Rectangle currRect;//当前正在绘制的举行
private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左右的坐标,这样重绘的效率更高。
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
mouseStatus = true;
startPoint.X = e.X;
startPoint.Y = e.Y;
//重新一个矩形,重置最大重绘矩形的上下左右的坐标
minStartX = e.X;
minStartY = e.Y;
maxEndX = e.X;
maxEndY = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseStatus)
{
endPoint.X = e.X; endPoint.Y = e.Y;
//这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只有从左上开始往右下角才能画出矩形。
//这样处理的话,可以任意方向,当然中途可以更换方向。
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
minStartX = Math.Min(minStartX, realStartX);
minStartY = Math.Min(minStartY, realStartY);
maxEndX = Math.Max(maxEndX, realEndX);
maxEndY = Math.Max(maxEndY, realEndY);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
//一下是为了获取最大重绘矩形。
Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
mouseStatus = false;
endPoint.X = e.X; endPoint.Y = e.Y;
int realStartX = Math.Min(startPoint.X, endPoint.X);
int realStartY = Math.Min(startPoint.Y, endPoint.Y);
int realEndX = Math.Max(startPoint.X, endPoint.X);
int realEndY = Math.Max(startPoint.Y, endPoint.Y);
currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
rectList.Add(currRect);//当前矩形算是被认可了,所以存起来
this.Invalidate();//重绘整个界面
}
private void Form1_Paint(object sender, PaintEventArgs e)//处理重绘情况
{
Graphics g = e.Graphics;
g.Clear(this.BackColor);
g.DrawRectangle(new Pen(Color.Red, 1), currRect);
foreach (Rectangle rect in rectList)
g.DrawRectangle(new Pen(Color.Red, 1), rect);
}
}
}
希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实画矩形的原理都是一样的,都是获取对角线上的两个点,获取后就可以确定一个矩形。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绘制矩形
用 GDI+ 绘制矩形与绘制直线类似。若要绘制矩形,需要 Graphics 对象和 Pen 对象。Graphics 对象提供 DrawRectangle 方法,Pen 对象存储属性(例如线宽和颜色)。将 Pen 对象作为参数之一传递给 DrawRectangle 方法。下面的示例绘制了一个矩形,其左上角位于 (100, 50),宽度为 80,高度为 40:
myGraphics.DrawRectangle(myPen, 100, 50, 80, 40);
DrawRectangle 是 Graphics 类的一个重载方法,因此,有数种为其提供参数的方式。例如,可构造 Rectangle 对象并将 Rectangle 对象作为参数传递给 DrawRectangle 方法:
Rectangle myRectangle = new Rectangle(100, 50, 80, 40);
myGraphics.DrawRectangle(myPen, myRectangle);
Rectangle 对象具有用于处理和收集矩形相关信息的方法和属性。例如,Inflate 和 Offset 方法可更改矩形的大小和位置。IntersectsWith 方法判断矩形是否与另一给定矩形相交,Contains 方法判断一个给定点是否在该矩形内。
用 GDI+ 绘制矩形与绘制直线类似。若要绘制矩形,需要 Graphics 对象和 Pen 对象。Graphics 对象提供 DrawRectangle 方法,Pen 对象存储属性(例如线宽和颜色)。将 Pen 对象作为参数之一传递给 DrawRectangle 方法。下面的示例绘制了一个矩形,其左上角位于 (100, 50),宽度为 80,高度为 40:
myGraphics.DrawRectangle(myPen, 100, 50, 80, 40);
DrawRectangle 是 Graphics 类的一个重载方法,因此,有数种为其提供参数的方式。例如,可构造 Rectangle 对象并将 Rectangle 对象作为参数传递给 DrawRectangle 方法:
Rectangle myRectangle = new Rectangle(100, 50, 80, 40);
myGraphics.DrawRectangle(myPen, myRectangle);
Rectangle 对象具有用于处理和收集矩形相关信息的方法和属性。例如,Inflate 和 Offset 方法可更改矩形的大小和位置。IntersectsWith 方法判断矩形是否与另一给定矩形相交,Contains 方法判断一个给定点是否在该矩形内。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询