求一段C#代码,实现如下功能

netboygg 2012-09-04 08:34:25
最近公司要求做一个软件,里面有个主要的功能,就是实现用鼠标圈选出选区:连续点击窗体,最后一次点击与第一次的重合,然后形成一个选区,就像PS里的矩形选择工具,但不限于点击4此。
我只实现了一点,觉得差的比较远:想请各位帮帮忙,分不够再开新贴,谢谢了:

public partial class Form1 : Form
{
Graphics gra;
Point firstpoint;
Point secondpoint;
int s = 0;
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
gra = this.CreateGraphics();
firstpoint = new Point(0, 0);
secondpoint = new Point(0, 0);

}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
s = 0;
if (firstpoint.X == 0)
{
firstpoint.X = e.X;
firstpoint.Y = e.Y;
s = 1;
Pen thepen = new Pen(Color.Red, 4);
gra.DrawRectangle(thepen, firstpoint.X, firstpoint.Y, 0.5F, 0.5F);

}
if (s == 0)
{
secondpoint.X = e.X;
secondpoint.Y = e.Y;
s = 2;
Pen thepen = new Pen(Color.Red, 4);
gra.DrawRectangle(thepen, secondpoint.X, secondpoint.Y, 0.5F, 0.5F);
}

if (s == 2)
{
Pen p = new Pen(Color.Red, 1);
float[] dashValues = { 2f, 2f };
p.DashPattern = dashValues;
gra.DrawLine(p, firstpoint, secondpoint);
firstpoint.X = 0;
firstpoint.Y = 0;
secondpoint.X = 0;
secondpoint.Y = 0;

}

}
}
...全文
478 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xc人生 2012-11-22
  • 打赏
  • 举报
回复
有谁做过这样的功能该如何做,就像谷歌地图那样,在textbox中输入关键字或地名,能够在地图上对应的找到该地点并显示(我是在自己做个查询系统,当然不是基于网络的),可能有人用过ARCgis中的地址定位器这个功能,和这个基本是一样的。
xc人生 2012-11-22
  • 打赏
  • 举报
回复
这个所画的区域是随鼠标的移动变化吗,还有gra.DrawRectangle(thepen, firstpoint.X, firstpoint.Y, 0.5F, 0.5F);中哦0.5F是什么意思,
netboygg 2012-09-04
  • 打赏
  • 举报
回复

谢谢大家提供的思路!现在已经完成这样的效果了:


现在需要将此形状,填充成一定颜色的区块。该怎么做?

 public partial class Form1 : Form
{
Graphics gra;
int s = 0;
private List<PointF> _list = new List<PointF>();
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
gra = this.CreateGraphics();
this.Cursor = Cursors.Cross;
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Pen thepen = new Pen(Color.Red, 4);
if (e.Button == MouseButtons.Left)
{
_list.Add(new Point(e.X, e.Y));


if (_list.Count != 0)
{

if (_list.Count == 1)
{

gra.DrawRectangle(thepen, _list[0].X, _list[0].Y, 0.5F, 0.5F);
}
if (_list.Count > 1)
{
Pen p = new Pen(Color.Red, 1);
float[] dashValues = { 2f, 2f };
//float[] dashValues = { 5, 2, 15, 4 };
p.DashPattern = dashValues;
gra.DrawRectangle(thepen, _list[_list.Count - 1].X, _list[_list.Count - 1].Y, 0.5F, 0.5F);
gra.DrawLine(p, _list[_list.Count - 1], _list[_list.Count-2]);
this.Cursor = Cursors.Cross;
}
}
}
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{

}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{

if (_list.Count != 0)
{


if (_list.Count > 2)
{
if (e.X == _list[0].X && e.Y == _list[0].Y)
{
this.Cursor = Cursors.Hand;

}
if (e.X != _list[0].X || e.Y != _list[0].Y)
{
this.Cursor = Cursors.Cross;
}
}
}

}
}
cry222222 2012-09-04
  • 打赏
  • 举报
回复
用数组来记录点,根据数组来画线与画点,当点与点的坐标相同的时候再画面
panjia8 2012-09-04
  • 打赏
  • 举报
回复
你的业务可以这样做,先用数组来记录点,根据数组来画线与画点,当点与点的坐标相同的时候再画面
  • 打赏
  • 举报
回复
哦哦哦,有空看看
zzz82103 2012-09-04
  • 打赏
  • 举报
回复

Graphics gra;
Point firstpoint;
Point secondpoint;
private void Form1_Load(object sender, EventArgs e)
{
gra = this.CreateGraphics();
firstpoint = new Point(0, 0);
secondpoint = new Point(0, 0);
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
firstpoint.X = e.X;
firstpoint.Y = e.Y;
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
secondpoint.X = e.X;
secondpoint.Y = e.Y;
gra.DrawLine(Pens.Black, firstpoint, secondpoint);
}

mousedown记起点坐标,mouseup记终点坐标,按你的理解变通下就可以
netboygg 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
建议整理下需求。目前问题描述有点混乱。
[/Quote]

需求就像我画的这张图一样:依次点击(多点),得出选区:
Castiel丶Luo 2012-09-04
  • 打赏
  • 举报
回复
一楼给出思路了 代码还得自己码
Conmajia 2012-09-04
  • 打赏
  • 举报
回复
建议整理下需求。目前问题描述有点混乱。
bdmh 2012-09-04
  • 打赏
  • 举报
回复
给你个思路,mousedown时,判断如果是左键,记录坐标值到列表,如果是右键(这个也可以在mouseup中判断),判断坐标值是否和第一个值相同,如果相同,结束,划线,如果不同,做其他处理
assky124 2012-09-04
  • 打赏
  • 举报
回复

protected override void DrawElement(Graphics g, RectangleF rect)
{
//base.DrawElement(g, rect);
g.SmoothingMode = SmoothingMode.AntiAlias;

PointF[] pts = _pts.ToArray();

if (pts.Length > 1)
{
Brush brush = GetFill();
if (brush != null)
{
g.FillPolygon(brush, pts);
}

Pen p = GetBorderPen();
if (p != null)
{
g.DrawPolygon(p, pts);
}
}
}

phper530 2012-09-04
  • 打赏
  • 举报
回复
效果不错。帮顶下。
wy811007 2012-09-04
  • 打赏
  • 举报
回复
好厉害啊 我是过来学习的
huwei001982 2012-09-04
  • 打赏
  • 举报
回复
FillPath 即可填充

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧