📄 drawsysview.cpp
字号:
// DrawSysView.cpp : implementation of the CDrawSysView class
//
#include "stdafx.h"
#include "DrawSys.h"
#include "math.h"
#include "MainFrm.h"
#include "DrawSysDoc.h"
#include "DrawSysView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView
IMPLEMENT_DYNCREATE(CDrawSysView, CView)
BEGIN_MESSAGE_MAP(CDrawSysView, CView)
//{{AFX_MSG_MAP(CDrawSysView)
ON_COMMAND(IDM_LINE, OnLine)
ON_COMMAND(IDM_CIRCLE, OnCircle)
ON_UPDATE_COMMAND_UI(IDM_LINE, OnUpdateLine)
ON_UPDATE_COMMAND_UI(IDM_CIRCLE, OnUpdateCircle)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(IDM_DDA, OnDda)
ON_COMMAND(IDM_BRESENHAM, OnBresenham)
ON_COMMAND(IDM_SET, OnSet)
ON_COMMAND(IDM_MANYBD, OnManybd)
ON_UPDATE_COMMAND_UI(IDM_MANYBD, OnUpdateManybd)
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(IDM_CUT, OnCut)
ON_UPDATE_COMMAND_UI(IDM_CUT, OnUpdateCut)
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_RBUTTONDBLCLK()
ON_COMMAND(IDM_BEZIER, OnBezier)
ON_UPDATE_COMMAND_UI(IDM_BEZIER, OnUpdateBezier)
ON_COMMAND(IDM_TEXT, OnText)
ON_COMMAND(IDM_CLEAR, OnClear)
ON_COMMAND(IDM_STROKE, OnStroke)
ON_UPDATE_COMMAND_UI(IDM_STROKE, OnUpdateStroke)
ON_UPDATE_COMMAND_UI(IDM_TEXT, OnUpdateText)
ON_COMMAND(IDM_TEST, OnTest)
ON_COMMAND(IDM_RANDLINE, OnRandline)
ON_COMMAND(IDM_REFRESH, OnRefresh)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView construction/destruction
CDrawSysView::CDrawSysView()
{
// TODO: add construction code here
m_dsDrawSort=DsNull;
m_dlsDrawLSort=DlsBresenham;
m_startPoint.x=0;
m_startPoint.y=0;
m_endPoint.x=0;
m_endPoint.y=0;
m_bIsMouseDown=0;
m_bIsFirstDone=0;
m_bIsDel=0;
m_lPenColor=RGB(0,0,255);
m_lBkColor=RGB(255,255,255);
m_lFillColor=RGB(255,0,0);
m_iPenWidth=1;
m_lPenColor=RGB(0,0,255);
m_dlsDrawLSort=DlsBresenham;
m_hDLCursor=AfxGetApp()->LoadCursor(IDC_DRAWLINE);
m_hDCCursor=AfxGetApp()->LoadCursor(IDC_DRAWCIRCLE);
m_hCLCursor=AfxGetApp()->LoadCursor(IDC_CUTLINE);
m_hDBCursor=AfxGetApp()->LoadCursor(IDC_DRAWBEZIER);
m_hDTCursor=AfxGetApp()->LoadCursor(IDC_DRAWTEXT);
m_hDSCursor=AfxGetApp()->LoadCursor(IDC_DRAWSTROKE);
m_pwndStatusBar=0;
}
CDrawSysView::~CDrawSysView()
{
}
BOOL CDrawSysView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView drawing
void CDrawSysView::OnDraw(CDC* pDC)
{
CDrawSysDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
list<LINE>::iterator pLine;
list<CIRCLE>::iterator pCircle;
list<BEZIER>::iterator pBezier;
vector<TEXT>::iterator pText;
//画直线
for(pLine=m_listAllLine.begin();pLine!=m_listAllLine.end();pLine++)
Line(*pLine,pDC);
//画圆
for(pCircle=m_listAllCircle.begin();pCircle!=m_listAllCircle.end();pCircle++)
Circle(*pCircle,pDC);
//画Bezier曲线
for(pBezier=m_listBezier.begin();pBezier!=m_listBezier.end();pBezier++)
Bezier(*pBezier,pDC);
//画文本
for(pText=m_vectorText.begin();pText!=m_vectorText.end();pText++)
pDC->TextOut((*pText).p.x,(*pText).p.y,(*pText).str);
CRect rectText;
GetClientRect(&rectText);
Draw3DText("欢迎使用陶氏作图系统",rectText,44,0,FW_BOLD,0,"楷体_GB2312",pDC);
rectText.left=rectText.right-290;
rectText.top=rectText.bottom-50;
Draw3DText("http://AIfan.54sc.com",rectText,30,0,FW_THIN,1,"Arial",pDC);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView printing
BOOL CDrawSysView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDrawSysView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDrawSysView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView diagnostics
#ifdef _DEBUG
void CDrawSysView::AssertValid() const
{
CView::AssertValid();
}
void CDrawSysView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawSysDoc* CDrawSysView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawSysDoc)));
return (CDrawSysDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawSysView message handlers
void CDrawSysView::OnLine()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsLine)
{
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=DsLine;
}
else
m_dsDrawSort=DsNull;
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnCircle()
{
// TODO: Add your command handler code here
if(m_dsDrawSort!=DsCircle)
{
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=DsCircle;
}
else
m_dsDrawSort=DsNull;
m_bIsFirstDone=0;
m_bIsMouseDown=0;
}
void CDrawSysView::OnUpdateLine(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsLine);
}
void CDrawSysView::OnUpdateCircle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_dsDrawSort==DsCircle);
}
void CDrawSysView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bIsMouseDown=1;
if(m_dsDrawSort==DsNull)
return;
CDC *pDC=GetDC();
LINE lTemp;
CRect rect;
TEXT tTemp;
int nSize;
DWORD dwStyle=WS_CHILD | ES_WANTRETURN | WS_TABSTOP;;
pDC->SetROP2(R2_NOTXORPEN);
switch(m_dsDrawSort)
{
case DsBezier:
Bezier(m_vectorCurBezier,pDC);
m_vectorCurBezier.push_back(point);
Bezier(m_vectorCurBezier,pDC);
break;
case DsText:
if(!m_edtTextIn)
{
if (!m_edtTextIn.CreateEx(WS_EX_CLIENTEDGE,_T("Edit"),NULL,
dwStyle,CRect(0,0,0,0), this,IDC_EDIT_TEXTIN))
{
TRACE(_T("Failed to create Edit TextIn.\n"));
OnClose();
}
CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
m_edtTextIn.SetFont(font);
}
rect.left=point.x;
rect.bottom=point.y+10;
rect.right=rect.left+90;
rect.top=rect.bottom-20;
m_edtTextIn.MoveWindow(&rect,1);
m_edtTextIn.UpdateWindow();
m_edtTextIn.ShowWindow(1);
m_edtTextIn.GetWindowText(tTemp.str);
if(tTemp.str!="")
{
m_startPoint.y-=7;
tTemp.p=m_startPoint;
m_vectorText.push_back(tTemp);
}
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;
}
if(m_dsDrawSort==DsManyBd && m_bIsFirstDone)
{
Line(m_startPoint,point,pDC);
lTemp.pStart=m_startPoint;
lTemp.pEnd=point;
m_listAllLine.push_back(lTemp);
}
if(m_dsDrawSort!=DsManyBd || !m_bIsFirstDone)
{
m_endPoint.x=m_startPoint.x=point.x;
m_endPoint.y=m_startPoint.y=point.y;
}
m_endPoint.x=point.x;
m_endPoint.y=point.y;
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::OnLButtonDown(nFlags, point);
}
void CDrawSysView::Line_DDA(POINT p1, POINT p2,CDC *pDC)
{
int i;
if(p1.x==p2.x)
{
//为竖线
if(p1.y<=p2.y)
{
for(i=p1.y;i<=p2.y;i++)
pDC->SetPixel(p1.x,i,m_lPenColor);
}
else
{
for(i=p2.y;i<=p1.y;i++)
pDC->SetPixel(p1.x,i,m_lPenColor);
}
return;
}
//为横线
if(p1.y==p2.y)
{
if(p1.x<=p2.x)
{
for(i=p1.x;i<=p2.x;i++)
pDC->SetPixel(i,p1.y,m_lPenColor);
}
else
{
for(i=p2.x;i<=p1.x;i++)
pDC->SetPixel(i,p1.y,m_lPenColor);
}
return;
}
//为斜线
float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);
float fTemp;
if(abs(m)<=1)
{
if(p1.x<p2.x)
{
fTemp=p1.y-m;
for(i=p1.x;i<=p2.x;i++)
pDC->SetPixel(i,fTemp+=m,m_lPenColor);
}
else
{
fTemp=p2.y-m;
for(i=p2.x;i<=p1.x;i++)
pDC->SetPixel(i,fTemp+=m,m_lPenColor);
}
return;
}
if(p1.y<p2.y)
{
fTemp=p1.x-1/m;
for(i=p1.y;i<=p2.y;i++)
pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
}
else
{
fTemp=p2.x-1/m;
for(i=p2.y;i<=p1.y;i++)
pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
}
}
void CDrawSysView::Line_Bresenham(POINT p1, POINT p2,CDC *pDC)
{
int i;
if(p1.x==p2.x)
{
//为竖线
if(p1.y<=p2.y)
{
for(i=p1.y;i<=p2.y;i++)
pDC->SetPixel(p1.x,i,m_lPenColor);
}
else
{
for(i=p2.y;i<=p1.y;i++)
pDC->SetPixel(p1.x,i,m_lPenColor);
}
return;
}
//为横线
if(p1.y==p2.y)
{
if(p1.x<=p2.x)
{
for(i=p1.x;i<=p2.x;i++)
pDC->SetPixel(i,p1.y,m_lPenColor);
}
else
{
for(i=p2.x;i<=p1.x;i++)
pDC->SetPixel(i,p1.y,m_lPenColor);
}
return;
}
//为斜线
float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);
float p;
p=2*m-1;
if(m>0 && m<=1)
{
if(p1.x<p2.x)
{
while(p1.x<=p2.x)
{
pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
if(p>=0)
{
p+=2*m-2;
p1.y++;
}
else
p+=2*m;
}
}
else
{
while(p2.x<=p1.x)
{
pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
if(p>=0)
{
p+=2*m-2;
p2.y++;
}
else
p+=2*m;
}
}
return;
}
p=-2*m-1;
if(m<0 && m>=-1)
{
if(p1.x<p2.x)
{
while(p1.x<=p2.x)
{
pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
if(p>=0)
{
p+=-2*m-2;
p1.y--;
}
else
p+=-2*m;
}
}
else
{
while(p2.x<=p1.x)
{
pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
if(p>=0)
{
p+=-2*m-2;
p2.y--;
}
else
p+=-2*m;
}
}
return;
}
p=2/m-1;
if(m>1)
{
if(p1.y<p2.y)
{
while(p1.y<=p2.y)
{
pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
if(p>=0)
{
p+=2/m-2;
p1.x++;
}
else
p+=2/m;
}
}
else
{
while(p2.y<=p1.y)
{
pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
if(p>=0)
{
p+=2/m-2;
p2.x++;
}
else
p+=2/m;
}
}
return;
}
p=-2/m-1;
if(p1.y<p2.y)
{
while(p1.y<=p2.y)
{
pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
if(p>=0)
{
p+=-2/m-2;
p1.x--;
}
else
p+=-2/m;
}
}
else
{
while(p2.y<=p1.y)
{
pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
if(p>=0)
{
p+=-2/m-2;
p2.x--;
}
else
p+=-2/m;
}
}
}
void CDrawSysView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bIsMouseDown=0;
if(m_dsDrawSort==DsNull)
return;
CDC *pDC=GetDC();
CPen Pen;
LINE lTemp;
CIRCLE cTemp;
int r;
RECT rect;
list<LINE>::iterator pLine=m_listAllLine.begin();
list<LINE>::iterator pTemp;
switch(m_dsDrawSort)
{
case DsManyBd:
case DsLine:
Line(m_startPoint,point,GetDC());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -