画图板---画多边形代码

源代码下载

多边形也就是由一些连续的直线组成的,所以绘图的代码还是前面的画直线的那两种算法,只不过在鼠标移动的过程中要特别注意记录终点的位置而已,代码中还是存在着bug,画多边形的时候出现了黄色的阴影线,真是奇怪的问题。为了判别是否是多边形的第一条边,加入了一个新变量:bool m_bIsFirstDone;//是否第一条边

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->voidCMyDrawView::OnMouseMove(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault

CStringstr;
CDC
*pDC=GetDC();

//状态栏显示坐标值
str.Format("X:%d,Y:%d",point.x,point.y);
if(!m_pwndStatusBar)
m_pwndStatusBar
=((CMainFrame*)AfxGetMainWnd())->GetStatusBar();
m_pwndStatusBar
->SetPaneText(2,str,1);

if(m_dsDrawSort==dsNULL)
return;
switch(m_dsDrawSort)
{
casedsLine:
SetCursor(m_hDLCursor);
break;
casedsCircle:
SetCursor(m_hDCCursor);
break;
}

//鼠标放开了
if(!m_bIsMoseDown)
return;

pDC
->SetROP2(R2_NOTXORPEN);

switch(m_dsDrawSort)
{
casedsLine:
{
//直线
Line*l1=newLine(m_startPoint,m_endPoint);
l1
->SetDrawLineSort(m_dlsDrawLineSort);
l1
->SetPenColor(m_lPenColor);
Line
*l2=newLine(m_startPoint,point);
l2
->SetDrawLineSort(m_dlsDrawLineSort);
l2
->SetPenColor(m_lPenColor);
l1
->Draw(pDC);
l2
->Draw(pDC);
break;
}
casedsCircle:
{
//
Line*l1=newLine(m_startPoint,m_endPoint);
l1
->SetDrawLineSort(m_dlsDrawLineSort);
l1
->SetPenColor(m_lPenColor);
Line
*l2=newLine(m_startPoint,point);
l2
->SetDrawLineSort(m_dlsDrawLineSort);
l2
->SetPenColor(m_lPenColor);
l1
->Draw(pDC);
l2
->Draw(pDC);

Circle
*c1=newCircle(m_startPoint,Distance(m_startPoint,m_endPoint));
c1
->SetPenColor(m_lPenColor);
c1
->Draw(pDC);
Circle
*c2=newCircle(m_startPoint,Distance(m_startPoint,point));
c2
->SetPenColor(m_lPenColor);
c2
->Draw(pDC);

break;
}
casedsPolyGon:
{
//折线
Line*l1=newLine(m_startPoint,m_endPoint);
l1
->SetDrawLineSort(m_dlsDrawLineSort);
l1
->SetPenColor(m_lPenColor);
Line
*l2=newLine(m_startPoint,point);
l2
->SetDrawLineSort(m_dlsDrawLineSort);
l2
->SetPenColor(m_lPenColor);
l1
->Draw(pDC);
l2
->Draw(pDC);
break;
}

}

m_endPoint
=point;//记录下终点,时刻刷新最后的点
ReleaseDC(pDC);
CView::OnMouseMove(nFlags,point);
}

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->voidCMyDrawView::OnLButtonUp(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault

m_bIsMoseDown
=FALSE;//鼠标未按下
if(m_dsDrawSort==dsNULL)
return;

CDC
*pDC=GetDC();
LinelTemp;
switch(m_dsDrawSort)
{
casedsLine:
casedsPolyGon:
{
//画直线或折线
Line*pL1=newLine(m_startPoint,point);
pL1
->SetDrawLineSort(m_dlsDrawLineSort);
pL1
->SetPenColor(m_lPenColor);
pL1
->Draw(pDC);

lTemp.SetStartPoint(m_startPoint);
//设置起点
lTemp.SetEndPoint(point);//设置终点
lTemp.SetDrawLineSort(m_dlsDrawLineSort);//设置画直线方式
lTemp.SetPenColor(m_lPenColor);//设置画笔颜色
m_listAllLines.push_back(lTemp);//保存此直线
if(m_dsDrawSort==dsPolyGon)
{
m_startPoint
=point;//把鼠标up的那一点作为新的起点
if(!m_bIsFirstDone)
{
//第一条边完成
m_bIsFirstDone=TRUE;
}
}
SetCursor(m_hDLCursor);
break;
}
casedsCircle:
{
//画圆
CirclecTemp;
doubleradius=Distance(m_startPoint,point);//计算半径大小
Circle*pC1=newCircle(m_startPoint,radius);
pC1
->SetPenColor(m_lPenColor);
pC1
->Draw(pDC);

cTemp.SetRadis(radius);
//设置半径
cTemp.SetMidPoint(m_startPoint);//设置圆心
cTemp.SetPenColor(m_lPenColor);//设置画笔颜色
m_listAllCircles.push_back(cTemp);//保存此圆

pDC
->SetROP2(R2_NOTXORPEN);//PixelistheinverseoftheR2_XORPENcolor(finalpixel=NOT(penXORscreenpixel)).
Line*pL1=newLine(m_startPoint,point);
pL1
->SetPenColor(m_lPenColor);
pL1
->Draw(pDC);
SetCursor(m_hDCCursor);
break;
}
}
ReleaseDC(pDC);
CView::OnLButtonUp(nFlags,point);
}

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->voidCMyDrawView::OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
m_bIsMoseDown=TRUE;//鼠标按下了
if(m_dsDrawSort==dsNULL)//画图类型未选择
return;
CDC
*pDC=GetDC();
pDC
->SetROP2(R2_NOTXORPEN);

LinelTemp;

if(m_dsDrawSort==dsPolyGon&&m_bIsFirstDone)
{
Line
*pL1=newLine(m_startPoint,point);
pL1
->Draw(pDC);

lTemp.SetStartPoint(m_startPoint);
lTemp.SetEndPoint(point);
m_listAllLines.push_back(lTemp);
}

画图板---画多边形代码