引用: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:
。。。。
}