📄 drawsysview.cpp
字号:
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.x=rect.left;
p2.y=rect.top;
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;
}
//iRgnCode1==8 || 4
if(m<0)
{
//iRgnCode1==8
if(p1.y<rect.top)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
//iRgnCode1==4
p1.x+=(rect.bottom-p1.y)/m;
if(p1.x>rect.right)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.y=rect.bottom;
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=p1.x+(p2.y-p1.y)/m;
return;
}
if(p1.y>rect.bottom)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.x+=(rect.top-p1.y)/m;
if(p1.x>rect.right)
{
p1.x=p2.x=0;
p1.y=p2.y=0;
return;
}
p1.y=rect.top;
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=p1.x+(p2.y-p1.y)/m;
//--------------------------------------------
}
void CDrawSysView::CutLine(RECT rect, LINE &l)
{
POINT p1,p2;
p1=l.pStart;
p2=l.pEnd;
CutLine(rect,p1,p2);
l.pStart=p1;
l.pEnd=p2;
}
void CDrawSysView::Bezier(vector<POINT> vectorPoint,CDC *pDC)
{
int n=vectorPoint.size()-1;
int i,r;
float u;
POINT *p=new POINT[n+1];
vector<POINT> vectorBPoint;
CPen pen;
for(u=0;u<=1;u+=0.0005)
{
for(i=0;i<=n;i++)
p[i]=vectorPoint[i];
for(r=1;r<=n;r++)
{
for(i=0;i<=n-r;i++)
{
p[i].x=(1-u)*p[i].x+u*p[i+1].x;
p[i].y=(1-u)*p[i].y+u*p[i+1].y;
}
}
vectorBPoint.push_back(p[0]);
}
pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
pDC->SelectObject(&pen);
n=vectorBPoint.size();
for(i=1;i<n;i++)
{
pDC->MoveTo(vectorBPoint[i-1]);
pDC->LineTo(vectorBPoint[i]);
}
}
void CDrawSysView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
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::OnRButtonDown(nFlags, point);
}
void CDrawSysView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
LINE lTemp;
switch(m_dsDrawSort)
{
case DsManyBd:
Line(m_startPoint,m_spManyBd,pDC);
lTemp.pStart=m_startPoint;
lTemp.pEnd=m_spManyBd;
m_listAllLine.push_back(lTemp);
m_bIsFirstDone=0;
case DsLine:
SetCursor(m_hDLCursor);
break;
case DsCircle:
SetCursor(m_hDCCursor);
break;
case DsCutLine:
SetCursor(m_hCLCursor);
break;
case DsBezier:
m_listBezier.push_back(m_vectorCurBezier);
m_vectorCurBezier.clear();
SetCursor(m_hDBCursor);
break;
case DsText:
SetCursor(m_hDTCursor);
break;
case DsStroke:
SetCursor(m_hDSCursor);
break;
}
CView::OnRButtonUp(nFlags, point);
}
void CDrawSysView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
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::OnRButtonDblClk(nFlags, point);
}
void CDrawSysView::OnBezier()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsBezier)
{
CDC *pDC=GetDC();
TEXT tTemp;
int nSize;
switch(m_dsDrawSort)
{
case DsManyBd:
if(m_bIsFirstDone)
{
LINE lTemp;
Line(m_startPoint,m_spManyBd,pDC);
lTemp.pStart=m_startPoint;
lTemp.pEnd=m_spManyBd;
m_listAllLine.push_back(lTemp);
}
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=DsBezier;
}
else
{
m_listBezier.push_back(m_vectorCurBezier);
m_vectorCurBezier.clear();
m_dsDrawSort=DsNull;
}
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnUpdateBezier(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsBezier);
}
void CDrawSysView::OnText()
{
// TODO: Add your command handler code here
CDC *pDC=GetDC();
if(m_dsDrawSort!=DsText)
{
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;
}
m_dsDrawSort=DsText;
}
else
{
TEXT tTemp;
int nSize;
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);
m_dsDrawSort=DsNull;
}
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnClear()
{
// TODO: Add your command handler code here
CRect rect;
m_listAllLine.clear();
m_listAllCircle.clear();
m_listBezier.clear();
m_vectorText.clear();
GetClientRect(&rect);
InvalidateRect(&rect,1);
}
void CDrawSysView::OnStroke()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsStroke)
{
TEXT tTemp;
int nSize;
CDC *pDC=GetDC();
switch(m_dsDrawSort)
{
case DsManyBd:
if(m_bIsFirstDone)
{
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=DsStroke;
}
else
m_dsDrawSort=DsNull;
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnUpdateStroke(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsStroke);
}
void CDrawSysView::OnUpdateText(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsText);
}
void CDrawSysView::OnTest()
{
// TODO: Add your command handler code here
CDC *pDC=GetDC();
int i;
long temp=m_lPenColor;
CBrush brush;
CRect rect;
int nScreenWidth;
int nScreenHight;
TEXT tTemp;
int nSize;
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=DsNull;
brush.CreateSolidBrush(RGB(255,255,255));
GetClientRect(&rect);
pDC->FillRect(&rect,&brush);
brush.DeleteObject();
nScreenWidth=rect.right;
nScreenHight=rect.bottom;
// for(i=5;i<=505;i++)
// {
// m_lPenColor=RGB(255,0,i*255/550);
// Line(255,320,i,70,pDC);
// }
// for(i=5;i<=505;i++)
// {
// m_lPenColor=RGB(i*255/550,255,0);
// Line(255,320,i,570,pDC);
// }
// for(i=70;i<570;i++)
// {
// m_lPenColor=RGB(0,255,i*255/650);
// Line(255,320,5,i,pDC);
// }
// for(i=70;i<570;i++)
// {
// m_lPenColor=RGB(0,i*255/650,255);
// Line(255,320,505,i,pDC);
// }
//
// for(int r=0;r<=250;r++)
// {
// m_lPenColor=RGB(0,255-r,255+r);
// Circle(760,320,r,pDC);
// }
for(i=5;i<=nScreenWidth/2+5;i++)
{
m_lPenColor=RGB(255,0,i*255/550);
Line(nScreenWidth/4+5,nScreenHight/2,i,nScreenHight/2-nScreenWidth/4,pDC);
}
for(i=5;i<=nScreenWidth/2+5;i++)
{
m_lPenColor=RGB(i*255/550,255,0);
Line(nScreenWidth/4+5,nScreenHight/2,i,nScreenHight/2+nScreenWidth/4,pDC);
}
for(i=nScreenHight/2-nScreenWidth/4;i<nScreenHight/2+nScreenWidth/4;i++)
{
m_lPenColor=RGB(0,255,i*255/650);
Line(nScreenWidth/4+5,nScreenHight/2,5,i,pDC);
}
for(i=nScreenHight/2-nScreenWidth/4;i<nScreenHight/2+nScreenWidth/4;i++)
{
m_lPenColor=RGB(0,i*255/650,255);
Line(nScreenWidth/4+5,nScreenHight/2,nScreenWidth/2+5,i,pDC);
}
for(int r=0;r<=nScreenWidth/4-5;r++)
{
m_lPenColor=RGB(0,255-r,255+r);
Circle(nScreenWidth*0.75+5,nScreenHight/2,r,pDC);
}
ReleaseDC(pDC);
}
void CDrawSysView::Line(POINT p1, POINT p2, CDC *pDC)
{
if(m_dlsDrawLSort==DlsDDA)
Line_DDA(p1,p2,pDC);
else
Line_Bresenham(p1,p2,pDC);
}
void CDrawSysView::Line(long p1x, long p1y, long p2x, long p2y, CDC *pDC)
{
POINT p1,p2;
p1.x=p1x;
p1.y=p1y;
p2.x=p2x;
p2.y=p2y;
Line(p1,p2,pDC);
}
void CDrawSysView::Circle(long pcx, long pcy, int r, CDC *pDC)
{
POINT pc;
pc.x=pcx;
pc.y=pcy;
Circle(pc,r,pDC);
}
void CDrawSysView::OnRandline()
{
// TODO: Add your command handler code here
CDC *pDC=GetDC();
CRect rect;
int i;
LINE lTemp;
TEXT tTemp;
int nSize;
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=DsNull;
srand(time(0));
GetClientRect(&rect);
for(i=0;i<500;i++)
{
lTemp.pStart.x=rect.left+(rect.right-rect.left)*rand()*1.0/RAND_MAX;
lTemp.pStart.y=rect.top+(rect.bottom-rect.top)*rand()*1.0/RAND_MAX;
lTemp.pEnd.x=rect.left+(rect.right-rect.left)*rand()*1.0/RAND_MAX;
lTemp.pEnd.y=rect.top+(rect.bottom-rect.top)*rand()*1.0/RAND_MAX;
m_listAllLine.push_back(lTemp);
}
InvalidateRect(rect,1);
ReleaseDC(pDC);
}
void CDrawSysView::Draw3DText(CString str,CRect rectText,int nHeight,int nWidth,int nWeight,BYTE bItalic,LPCTSTR lpszFacename,CDC *pDC)
{
CFont fontLogo,*oldFont;
COLORREF oldColor;
fontLogo.CreateFont(nHeight,nWidth,0,0,nWeight,bItalic,FALSE,FALSE,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
FIXED_PITCH | FF_ROMAN,lpszFacename);
pDC->SetBkMode(TRANSPARENT);
oldFont=pDC->SelectObject(&fontLogo);
oldColor=pDC->SetTextColor(RGB(0,0,0));
pDC->DrawText(str,rectText+CPoint(1,1),DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
pDC->SetTextColor(::GetSysColor(COLOR_BTNFACE));
pDC->DrawText(str,rectText,DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
pDC->SetTextColor(oldColor);
pDC->SelectObject(oldFont);
}
void CDrawSysView::OnRefresh()
{
// TODO: Add your command handler code here
CRect rect;
GetClientRect(&rect);
InvalidateRect(&rect,1);
}
void CDrawSysView::Circle(CIRCLE c, CDC *pDC)
{
POINT pc=c.pMid;
int r=c.r;
Circle(pc,r,pDC);
}
void CDrawSysView::Line(LINE l,CDC *pDC)
{
POINT p1=l.pStart;
POINT p2=l.pEnd;
Line(p1,p2,pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -