引用:http://www.cnblogs.com/xpack/archive/2010/04/17/1714023.html
画多边形有专门的函数:DrawPolygon与FillPolygon,给它几个闭合的点就会成功的画出来,这没什么好说的;用鼠标动态描绘才有点意思。
首先做之前得构思下,我想这是很有必要的:
1,多边形是由多个点与边构成的,N个点代表N边形(N>2),所以我们只要能确定点就能画出多边形;
2,动态生成点当然是由鼠标左击产生最好了;
3,既然是动态描绘,当然我们需要的是所画即所得的效果了,其实就是动态的把多边形的边画出来,我想这事情交给鼠标的移动MOVE事件最好了;
4,有了多边形的点和边,显然多边形已画出来了,此步要做的当然就是释放鼠标事件生成最终的多边形。这事一般交给鼠标UP事件,但我个人觉得还是双击事件更好,因为画点的时候也有UP事件;
5,当然想到画图就应该要注意下刷新与重绘的问题。
有思路了没行动可不行,毛爷爷说的好,实践不仅是检验真理的标准,而且是唯一标准。
public override void OnMouseDown(SelectionUIOverlay drawArea, MouseEventArgs e)
{
if(m_bfirst) //首先第一次创建两个点如下(e.X, e.Y),( e.X + 1, e.Y + 1)
{
m_bfirst = false;
newPolygon = new DrawPolygon(e.X, e.Y, e.X + 1, e.Y + 1);
AddNewObject(drawArea, newPolygon);
}
else
{
Point point = new Point(e.X, e.Y); //添加新的点
newPolygon.AddPoint(point);
}
}
public override void OnMouseMove(SelectionUIOverlay drawArea, MouseEventArgs e)
{
Point point = new Point(e.X, e.Y);
newPolygon.MoveHandleTo(point, newPolygon.HandleCount);//把新添加的点作为移动的对象,以便获得下一个新点
}
public override void OnMouseDoubleClick(SelectionUIOverlay drawArea, MouseEventArgs e)
{
m_bfirst = true;//重新复位以便下一次画图操作
newPolygon = null;
}
void Draw(Graphics g)
{
//画多边形可以通过画线的方式,也可以直接用画多边形的函数;两者的区别在于前者必须要画起始点与最后一个点的线以至是一个闭合的多边形
g.DrawPolygon(pen, Points);
g.FillPolygon(brush, Points);
}
深入思考:
有时我们的鼠标事件DOWN,UP,MOVE里面有许多不关图形的操作,我们可以使程序捕捉鼠标消息,直到我们把图形画出来为止,再释放消息。
for (;;)
{
MSG msg=new MSG();
if(GetMessage(ref msg, 0, 0, 0)!=1) break;
switch (msg.message)
{
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
。。。。
}