画图板---画多边形代码
多边形也就是由一些连续的直线组成的,所以绘图的代码还是前面的画直线的那两种算法,只不过在鼠标移动的过程中要特别注意记录终点的位置而已,代码中还是存在着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);
}
{
//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);
}
{
//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);
}
{
//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);
}