📄 drawsysview.cpp
字号:
lTemp.pStart=m_startPoint;
lTemp.pEnd=point;
m_listAllLine.push_back(lTemp);
if(m_dsDrawSort==DsManyBd)
m_startPoint=point;
SetCursor(m_hDLCursor);
break;
case DsCircle:
r=GetDist(m_startPoint,point);
Circle(m_startPoint,r,pDC);
cTemp.pMid=m_startPoint;
cTemp.r=r;
m_listAllCircle.push_back(cTemp);
pDC->SetROP2(R2_NOTXORPEN);
Line(m_startPoint,point,pDC);
SetCursor(m_hDCCursor);
break;
case DsCutLine:
rect.left=m_startPoint.x;
rect.top=m_startPoint.y;
rect.right=point.x;
rect.bottom=point.y;
while(pLine!=m_listAllLine.end())
{
CutLine(rect,*pLine);
if(!(*pLine).pStart.x && !(*pLine).pStart.y && !(*pLine).pEnd.x && !(*pLine).pEnd.y)
{
pTemp=pLine;
pTemp++;
m_listAllLine.remove(*pLine);
pLine=pTemp;
}
else
pLine++;
}
GetClientRect(&rect);
InvalidateRect(&rect,1);
SetCursor(m_hCLCursor);
break;
case DsBezier:
Bezier(m_vectorCurBezier,pDC);
m_vectorCurBezier.pop_back();
m_vectorCurBezier.push_back(point);
Bezier(m_vectorCurBezier,pDC);
SetCursor(m_hDBCursor);
break;
case DsText:
SetCursor(m_hDTCursor);
break;
case DsStroke:
SetCursor(m_hDSCursor);
break;
}
CView::OnLButtonUp(nFlags, point);
}
void CDrawSysView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
CDC *pDC=GetDC();
str.Format("X:%d,Y:%d",point.x,point.y);
if(!m_pwndStatusBar)
m_pwndStatusBar=((CMainFrame*)AfxGetMainWnd())->GetStatusBar();
m_pwndStatusBar->SetPaneText(1,str,1);
if(m_dsDrawSort==DsNull)
return;
switch(m_dsDrawSort)
{
case DsLine:
case DsManyBd:
SetCursor(m_hDLCursor);
break;
case DsCircle:
SetCursor(m_hDCCursor);
break;
case DsCutLine:
SetCursor(m_hCLCursor);
break;
case DsBezier:
SetCursor(m_hDBCursor);
break;
case DsText:
SetCursor(m_hDTCursor);
break;
case DsStroke:
SetCursor(m_hDSCursor);
break;
}
if(!m_bIsMouseDown)
return;
CPen pen;
CRect rect;
list<LINE>::iterator p=m_listAllLine.end();
vector<POINT>::iterator pVector=m_vectorCurBezier.end();
pDC->SetROP2(R2_NOTXORPEN);
switch(m_dsDrawSort)
{
case DsManyBd:
p--;
if((*p).pStart.x==m_startPoint.x && (*p).pStart.y==m_startPoint.y)
m_listAllLine.pop_back();
if(!m_bIsFirstDone)
m_spManyBd=m_startPoint;
m_bIsFirstDone=1;
case DsLine:
Line(m_startPoint,m_endPoint,pDC);
Line(m_startPoint,point,pDC);
break;
case DsCircle:
Line(m_startPoint,m_endPoint,pDC);
Line(m_startPoint,point,pDC);
Circle(m_startPoint,GetDist(m_startPoint,m_endPoint),pDC);
Circle(m_startPoint,GetDist(m_startPoint,point),pDC);
break;
case DsCutLine:
pen.CreatePen(PS_DOT,m_iPenWidth,m_lPenColor);
pDC->SelectObject(&pen);
pDC->Rectangle(&CRect(m_startPoint,m_endPoint));
pDC->Rectangle(&CRect(m_startPoint,point));
break;
case DsBezier:
Bezier(m_vectorCurBezier,pDC);
m_vectorCurBezier.pop_back();
m_vectorCurBezier.push_back(point);
Bezier(m_vectorCurBezier,pDC);
break;
case DsStroke:
pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
pDC->SelectObject(&pen);
pDC->MoveTo(m_endPoint);
pDC->LineTo(point);
break;
}
m_endPoint=point;
CView::OnMouseMove(nFlags, point);
}
void CDrawSysView::Circle(POINT pc, int r,CDC *pDC)
{
int x,y;
float p;
pDC->SetViewportOrg(pc);
x=0;
y=r;
p=1.25-r;
while(x<=y+1)
{
//第1象限
pDC->SetPixel(x,y,m_lPenColor);
pDC->SetPixel(y,x,m_lPenColor);
//第2象限
pDC->SetPixel(-x,y,m_lPenColor);
pDC->SetPixel(-y,x,m_lPenColor);
//第3象限
pDC->SetPixel(-y,-x,m_lPenColor);
pDC->SetPixel(-x,-y,m_lPenColor);
//第4象限
pDC->SetPixel(x,-y,m_lPenColor);
pDC->SetPixel(y,-x,m_lPenColor);
x++;
if(p>=0)
{
y--;
p+=2*x+1-2*y;
}
else
p+=2*x+1;
}
pDC->SetViewportOrg(0,0);
}
int CDrawSysView::GetDist(POINT p1, POINT p2)
{
return pow(pow(p1.y-p2.y,2)+pow(p1.x-p2.x,2),1.0/2);
}
void CDrawSysView::OnDda()
{
// TODO: Add your command handler code here
m_dlsDrawLSort=DlsDDA;
}
void CDrawSysView::OnBresenham()
{
// TODO: Add your command handler code here
m_dlsDrawLSort=DlsBresenham;
}
void CDrawSysView::OnSet()
{
// TODO: Add your command handler code here
if(m_SetDlg.DoModal()==IDOK)
{
m_iPenWidth=m_SetDlg.GetPenWidth();
m_lPenColor=m_SetDlg.GetPenColor();
m_lBkColor=m_SetDlg.GetBkColor();
m_lFillColor=m_SetDlg.GetFillColor();
m_dlsDrawLSort=m_SetDlg.GetDrawLSort();
CDC *pDC=GetDC();
CPen Pen;
pDC->SetBkColor(m_lBkColor);
Pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
pDC->SelectObject(&Pen);
}
}
void CDrawSysView::OnManybd()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsManyBd)
{
TEXT tTemp;
int nSize;
CDC *pDC=GetDC();
switch(m_dsDrawSort)
{
case DsBezier:
m_listBezier.push_back(m_vectorCurBezier);
m_vectorCurBezier.clear();
break;
case DsText:
m_edtTextIn.GetWindowText(tTemp.str);
if(tTemp.str!="")
{
m_startPoint.y-=7;
tTemp.p=m_startPoint;
m_vectorText.push_back(tTemp);
}
m_edtTextIn.ShowWindow(0);
m_edtTextIn.SetWindowText("");
nSize=m_vectorText.size();
if(nSize>0)
pDC->TextOut(m_vectorText[nSize-1].p.x,m_vectorText[nSize-1].p.y,m_vectorText[nSize-1].str);
break;
}
m_dsDrawSort=DsManyBd;
}
else
{
if(m_bIsFirstDone)
{
CDC *pDC=GetDC();
LINE lTemp;
Line(m_startPoint,m_spManyBd,pDC);
lTemp.pStart=m_startPoint;
lTemp.pEnd=m_spManyBd;
m_listAllLine.push_back(lTemp);
}
m_dsDrawSort=DsNull;
}
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnUpdateManybd(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsManyBd);
}
void CDrawSysView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_dsDrawSort==DsNull)
return;
switch(m_dsDrawSort)
{
case DsLine:
case DsManyBd:
SetCursor(m_hDLCursor);
break;
case DsCircle:
SetCursor(m_hDCCursor);
break;
case DsCutLine:
SetCursor(m_hCLCursor);
break;
case DsBezier:
SetCursor(m_hDBCursor);
break;
case DsText:
SetCursor(m_hDTCursor);
break;
case DsStroke:
SetCursor(m_hDSCursor);
break;
}
CView::OnLButtonDblClk(nFlags, point);
}
void CDrawSysView::OnCut()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsCutLine)
{
TEXT tTemp;
int nSize;
CDC *pDC=GetDC();
switch(m_dsDrawSort)
{
case DsManyBd:
if(m_bIsFirstDone)
{
CDC *pDC=GetDC();
LINE lTemp;
Line(m_startPoint,m_spManyBd,pDC);
lTemp.pStart=m_startPoint;
lTemp.pEnd=m_spManyBd;
m_listAllLine.push_back(lTemp);
}
break;
case DsBezier:
m_listBezier.push_back(m_vectorCurBezier);
m_vectorCurBezier.clear();
break;
case DsText:
m_edtTextIn.GetWindowText(tTemp.str);
if(tTemp.str!="")
{
m_startPoint.y-=7;
tTemp.p=m_startPoint;
m_vectorText.push_back(tTemp);
}
m_edtTextIn.ShowWindow(0);
m_edtTextIn.SetWindowText("");
nSize=m_vectorText.size();
if(nSize>0)
pDC->TextOut(m_vectorText[nSize-1].p.x,m_vectorText[nSize-1].p.y,m_vectorText[nSize-1].str);
break;
}
m_dsDrawSort=DsCutLine;
}
else
m_dsDrawSort=DsNull;
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnUpdateCut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsCutLine);
}
void CDrawSysView::CutLine(RECT rect,POINT& p1, POINT& p2)
{
//说明:此坐标为设备坐标
int iRgnCode1=0;
int iRgnCode2=0;
int temp;
POINT ptTemp;
//使p1在前面
if(p1.x>p2.x)
{
ptTemp=p1;
p1=p2;
p2=ptTemp;
}
//使bottom比top大,right比left大
if(rect.bottom<rect.top)
{
temp=rect.bottom;
rect.bottom=rect.top;
rect.top=temp;
}
if(rect.right<rect.left)
{
temp=rect.right;
rect.right=rect.left;
rect.left=temp;
}
//----------求p1和p2的区域码----------
if(p1.x<rect.left)
iRgnCode1+=1;
if(p1.x>rect.right)
iRgnCode1+=1<<1;
if(p1.y>rect.bottom)
iRgnCode1+=1<<2;
if(p1.y<rect.top)
iRgnCode1+=1<<3;
if(p2.x<rect.left)
iRgnCode2+=1;
if(p2.x>rect.right)
iRgnCode2+=1<<1;
if(p2.y>rect.bottom)
iRgnCode2+=1<<2;
if(p2.y<rect.top)
iRgnCode2+=1<<3;
//------------------------------------
//被裁剪的线段在矩形内
if(!iRgnCode1 && !iRgnCode2)
return;
//被裁剪的线段在矩形外
if((iRgnCode1 & iRgnCode2)!=0 && (iRgnCode1 || iRgnCode2))
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
//竖线
if(p1.x==p2.x)
{
if(p1.y>p2.y)
{
temp=p1.y;
p1.y=p2.y;
p2.y=temp;
}
if(p1.y<rect.top)
{
p1.y=rect.top;
if(p2.y>rect.bottom)
p2.y=rect.bottom;
return;
}
p2.y=rect.bottom;
return;
}
//横线
if(p1.y==p2.y)
{
if(p1.x<rect.left)
{
p1.x=rect.left;
if(p2.x>rect.right)
p2.x=rect.right;
return;
}
p2.x=rect.right;
return;
}
//斜线
float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);
//---------------p1在矩形内,p2在矩形外---------------
if(!iRgnCode1)
{
if(m<0)
{
p2.y=p1.y+(rect.right-p1.x)*m;
if(p2.y>rect.top)
{
p2.x=rect.right;
return;
}
p2.y=rect.top;
p2.x=(p2.y-p1.y)/m+p1.x;
return;
}
p2.y=p1.y+(rect.right-p1.x)*m;
if(p2.y<rect.bottom)
{
p2.x=rect.right;
return;
}
p2.y=rect.bottom;
p2.x=(p2.y-p1.y)/m+p1.x;
return;
}
//---------------------------------------------------
//---------------p1在矩形外,p2在矩形内---------------
if(!iRgnCode2)
{
if(m<0)
{
p1.y=p2.y-m*(p2.x-rect.left);
if(p1.y<rect.bottom)
{
p1.x=rect.left;
return;
}
p1.y=rect.bottom;
p1.x=p2.x-(p2.y-p1.y)/m;
return;
}
p1.y=p2.y-m*(p2.x-rect.left);
if(p1.y>rect.top)
{
p1.x=rect.left;
return;
}
p1.y=rect.top;
p1.x=p2.x-(p2.y-p1.y)/m;
return;
}
//---------------------------------------------------
//---------------两点都在矩形外---------------
//iRgnCode1==9 || 1 || 5
if(p1.x<rect.left)
{
if(iRgnCode1==9)
{
if(m<0)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
temp=p1.x+(rect.top-p1.y)/m;
if(temp>rect.right)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
if(temp>rect.left)
{
p1.x=temp;
p1.y=rect.top;
p2.x=rect.right;
p2.y=p1.y+(p2.x-p1.x)*m;
if(p2.y<rect.bottom)
return;
p2.y=rect.bottom;
p2.x=p1.x+(p2.y-p1.y)/m;
return;
}
p1.y+=(rect.left-p1.x)*m;
if(p1.y>rect.bottom)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.x=rect.left;
p2.y=rect.bottom;
p2.x=p1.x+(p2.y-p1.y)/m;
if(p2.x<rect.right)
return;
p2.x=rect.right;
p2.y=p1.y+(p2.x-p1.x)*m;
return;
}
if(iRgnCode1==1)
{
if(m<0)
{
p1.y+=(rect.left-p1.x)*m;
if(p1.y<rect.top)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.x=rect.left;
p2.x=p1.x+(rect.top-p1.y)/m;
if(p2.x>rect.right)
{
p2.x=rect.right;
p2.y=p1.y+(p2.x-p1.x)*m;
return;
}
p2.y=rect.top;
return;
}
p1.y+=(rect.left-p1.x)*m;
if(p1.y>rect.bottom)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.x=rect.left;
p2.x=p1.x+(rect.bottom-p1.y)/m;
if(p2.x>rect.right)
{
p2.x=rect.right;
p2.y=p1.y+(p2.x-p1.x)*m;
return;
}
p2.y=rect.bottom;
return;
}
//iRgnCode1==5
if(m>0)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
temp=p1.x+(rect.bottom-p1.y)/m;
if(temp>rect.right)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
if(temp>rect.left)
{
p1.x=temp;
p1.y=rect.bottom;
p2.x=rect.right;
p2.y=p1.y+(p2.x-p1.x)*m;
if(p2.y>rect.top)
return;
p2.y=rect.top;
p2.x=p1.x+(p2.y-p1.y)/m;
return;
}
p1.y+=(rect.left-p1.x)*m;
if(p1.y<rect.top)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -