📄 drawsempleview.cpp
字号:
// DrawSempleView.cpp : implementation of the CDrawSempleView class
//
#include "stdafx.h"
#include "DrawSemple.h"
#include "math.h"
#include "Line.h"
#include "Ellipse.h"
#include "Circle.h"
#include "Rectangle.h"
#include "Tuyuan.h"
#include "List.h"
#include "DrawSempleDoc.h"
#include "DrawSempleView.h"
#include"DrawSempleDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CList L;
CTuyuan * xuanding=NULL;
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView
IMPLEMENT_DYNCREATE(CDrawSempleView, CView)
BEGIN_MESSAGE_MAP(CDrawSempleView, CView)
//{{AFX_MSG_MAP(CDrawSempleView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_CONTEXTMENU()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView construction/destruction
CDrawSempleView::CDrawSempleView()
{
// TODO: add construction code here
m_bDragging=false; //初始化拖拽标记
m_hCross=AfxGetApp()->LoadStandardCursor(IDC_CROSS);//获得十字光标句柄
}
CDrawSempleView::~CDrawSempleView()
{
}
BOOL CDrawSempleView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView drawing
void CDrawSempleView::OnDraw(CDC* pDC)
{
CDrawSempleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CString strCoins;
//先获得主窗口指针,再获得状态栏指针
CStatusBar * pStatus=(CStatusBar *)AfxGetApp()->m_pMainWnd->
GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
strCoins.Format("总图元:%d",CTuyuan::Tcount); //设置要显示的信息
pStatus->SetPaneText(1,strCoins); //显示硬币数量,画板编号从0开始
strCoins.Format("直线:%d",CLine::Lcount); //设置要显示的信息
pStatus->SetPaneText(2,strCoins); //显示硬币数量,画板编号从0开始
strCoins.Format("椭圆:%d",CEllipse::Ecount); //设置要显示的信息
pStatus->SetPaneText(3,strCoins); //显示硬币数量,画板编号从0开始
strCoins.Format("圆:%d",CCircle::Ccount); //设置要显示的信息
pStatus->SetPaneText(4,strCoins); //显示硬币数量,画板编号从0开始
strCoins.Format("矩形:%d",CRectangle::Rcount); //设置要显示的信息
pStatus->SetPaneText(5,strCoins); //显示硬币数量,画板编号从0开始
}
L.DrawAll(pDC);
if(xuanding!=NULL)
{
// CPen *pOldPen,*pNewPen;
CPoint pt1,pt2;
pt1=xuanding->Getpt1();
pt2=xuanding->Getpt2();
// pDC->SetROP2(R2_NOTXORPEN);
// pNewPen=new CPen(PS_SOLID,1,RGB(0,0,0));
// pOldPen = pDC->SelectObject(pNewPen);
CBrush aPen2(RGB(255,255,0));
CBrush *pOldBrush = pDC->SelectObject(&aPen2);
pDC->Ellipse(pt1.x-4,pt1.y-4,pt1.x+4,pt1.y+4);
pDC->Ellipse(pt2.x-4,pt2.y-4,pt2.x+4,pt2.y+4);
}
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView printing
BOOL CDrawSempleView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDrawSempleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDrawSempleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView diagnostics
#ifdef _DEBUG
void CDrawSempleView::AssertValid() const
{
CView::AssertValid();
}
void CDrawSempleView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawSempleDoc* CDrawSempleView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawSempleDoc)));
return (CDrawSempleDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawSempleView message handlers
CPoint ptOrg,ptStart,ptEnd;
void CDrawSempleView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// CClientDC dc(this);
// OnPrepareDC(&dc); //调整设备环境的属性
// dc.DPtoLP(&point); //将设备坐标转换为逻辑坐标
// CDC *pDC=GetDC();
// L.DrawAll(pDC);
switch(CDrawSempleDoc::flage)
//if(CDrawSempleDoc::flage!=0 && CDrawSempleDoc::ifxuanding==false)
{
case 1:
case 2:
case 3:
case 4:
{
CDC *pDC=GetDC();
SetCapture(); //捕捉鼠标
m_hCross=AfxGetApp()->LoadCursor(IDC_SHIZI);
::SetCursor(m_hCross);//设置十字光标
m_ptOrigin=point;
ptOrg=m_ptOrigin;
m_bDragging=TRUE; //设置拖拽标记
break;
}
case 11:
{
CDC *pDC=GetDC();
SetCapture(); //捕捉鼠标
m_hCross=AfxGetApp()->LoadCursor(IDC_HAND);
::SetCursor(m_hCross);//设置十字光标
m_ptOrigin=point;
ptOrg=m_ptOrigin;
m_bDragging=TRUE; //设置拖拽标记
break;
}
case 12:
case 13:
case 14:
if(xuanding!=NULL)
{
ptStart=xuanding->Getpt1();
ptEnd=xuanding->Getpt2();
if((point.x<=ptStart.x && point.x>=ptEnd.x &&
point.y<=ptStart.y && point.y>=ptEnd.y)||
(point.x>=ptStart.x && point.x<=ptEnd.x&&
point.y>=ptStart.y && point.y<=ptEnd.y))
{
CDC *pDC=GetDC();
SetCapture(); //捕捉鼠标
m_hCross=AfxGetApp()->LoadCursor(IDC_HAND);
::SetCursor(m_hCross);//设置十字光标
m_ptOrigin=point;
ptOrg=m_ptOrigin;
m_bDragging=TRUE; //设置拖拽标记
}
}
break;
default:
break;
}
CView::OnLButtonDown(nFlags, point);
}
void CDrawSempleView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
if(m_bDragging)
{
m_bDragging=false; //清拖拽标记
ReleaseCapture(); //释放鼠标,还原鼠标形状
CDC *pDC=GetDC();
int t=CDrawSempleDoc::flageline;
COLORREF rgb=RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b);
COLORREF rgbB=RGB(255,255,255);
switch(CDrawSempleDoc::flage)
{
case 1:
{
CLine *line=new CLine(m_ptOrigin,point,t,rgb,rgbB);
L.AddTuyuan(line);
ptStart=m_ptOrigin;
ptEnd=point;
delete line;
break;
}
case 2:
{
CEllipse *ellipse=new CEllipse(m_ptOrigin,point,t,rgb,rgbB);
L.AddTuyuan(ellipse);
delete ellipse;
break;
}
case 3:
{
CCircle *circle=new CCircle(m_ptOrigin,point,t,rgb,rgbB);
L.AddTuyuan(circle);
delete circle;
break;
}
case 4:
{
CRectangle *rectangle=new CRectangle(m_ptOrigin,point,t,rgb,rgbB);
L.AddTuyuan(rectangle);
delete rectangle;
break;
}
case 11:
{
xuanding=L.XuanDing(m_ptOrigin,point);
ptStart=m_ptOrigin; //保存选定范围起点
ptEnd=point; //保存选定范围终点
break;
}
case 12:
if(xuanding!=NULL)
{
xuanding->Setpoint(m_ptOrigin,point);
xuanding->DrawTuyuan(pDC);
}
break;
case 13:
if(xuanding!=NULL)
{ L.DelTuyuan(xuanding);
xuanding=NULL;
}
break;
case 14:
if(xuanding!=NULL)
{
xuanding->SetStyBrushRGB(RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b));
}
break;
default:
break;
}
CDrawSempleDoc * pDoc=GetDocument(); //获得文档对象的指针
ASSERT_VALID(pDoc); //测试文档对象是否运行有效
pDoc->UpdateAllViews(NULL);
L.DrawAll(pDC);
}
CView::OnLButtonUp(nFlags, point);
}
void CDrawSempleView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDragging && CDrawSempleDoc::flage!=0)
{
// CDrawSempleDoc * pDoc=GetDocument(); //获得文档对象的指针
// ASSERT_VALID(pDoc); //测试文档对象是否运行有效
CDC *pDC=GetDC();
pDC->SetROP2(R2_NOTXORPEN);//R2_NOTXORPEN
CPen *pOldPen,*pNewPen;
int t=CDrawSempleDoc::flageline;
pNewPen=new CPen(PS_SOLID,t,RGB(CDrawSempleDoc::r,CDrawSempleDoc::g,CDrawSempleDoc::b));
pOldPen = pDC->SelectObject(pNewPen);
switch(CDrawSempleDoc::flage)
{
case 1:
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(ptOrg);//消除原来画的线
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ptOrg=point;//记录上次这次画线的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 2:
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
pDC->Ellipse(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
ptOrg=point;//记录上次这次画椭圆的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 3:
int d,x,y;
d=(int)sqrt((m_ptOrigin.x-ptOrg.x)*(m_ptOrigin.x-ptOrg.x)
+(m_ptOrigin.y-ptOrg.y)*(m_ptOrigin.y-ptOrg.y))/2;
x=(int)(m_ptOrigin.x+ptOrg.x)/2;
y=(int)(m_ptOrigin.y+ptOrg.y)/2;
pDC->Ellipse(x-d,y-d,x+d,y+d);
d=(int)sqrt((m_ptOrigin.x-point.x)*(m_ptOrigin.x-point.x)
+(m_ptOrigin.y-point.y)*(m_ptOrigin.y-point.y))/2;
x=(int)(m_ptOrigin.x+point.x)/2;
y=(int)(m_ptOrigin.y+point.y)/2;
pDC->Ellipse(x-d,y-d,x+d,y+d);
ptOrg=point;//记录上次这次画圆的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 4:
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
ptOrg=point;//记录上次这次画矩形的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 11:
pDC->SelectObject(pOldPen);
delete pNewPen;
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,ptOrg.x,ptOrg.y);
pDC->Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
ptOrg=point;//记录上次这次画矩形的终点
break;
case 12:
if(xuanding!=NULL)
{
pDC->SetROP2(R2_NOTXORPEN);//R2_NOTXORPEN
CPen *pOldPen,*pNewPen;
pNewPen=new CPen(PS_SOLID,1,RGB(0,0,0));
pOldPen = pDC->SelectObject(pNewPen);
int dx,dy,ddx,ddy;
dx=point.x-m_ptOrigin.x;
dy=point.y-m_ptOrigin.y;
ddx=ptOrg.x-m_ptOrigin.x;
ddy=ptOrg.y-m_ptOrigin.y;
CPoint dpt1,dpt2,ddpt1,ddpt2,pSta,pEnd;
pSta=xuanding->Getpt1();
pEnd=xuanding->Getpt2();
dpt1.x=pSta.x+dx;
dpt1.y=pSta.y+dy;
dpt2.x=pEnd.x+dx;
dpt2.y=pEnd.y+dy;
ddpt1.x=pSta.x+ddx;
ddpt1.y=pSta.y+ddy;
ddpt2.x=pEnd.x+ddx;
ddpt2.y=pEnd.y+ddy;
int ft=xuanding->GetTflag();
switch(ft)
{
case 1:
pDC->MoveTo(ddpt1);
pDC->LineTo(ddpt2);//消除原来画的线
pDC->MoveTo(dpt1);
pDC->LineTo(dpt2);
ptOrg=point;//记录上次这次画线的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 2:
pDC->Ellipse(ddpt1.x,ddpt1.y,ddpt2.x,ddpt2.y);
pDC->Ellipse(dpt1.x,dpt1.y,dpt2.x,dpt2.y);
ptOrg=point;//记录上次这次画椭圆的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 3:
int d,x,y;
d=(int)sqrt((ddpt1.x-ddpt2.x)*(ddpt1.x-ddpt2.x)+
(ddpt1.y-ddpt2.y)*(ddpt1.y-ddpt2.y))/2;
x=(int)(ddpt1.x+ddpt2.x)/2;
y=(int)(ddpt1.y+ddpt2.y)/2;
pDC->Ellipse(x-d,y-d,x+d,y+d);
d=(int)sqrt((dpt1.x-dpt2.x)*(dpt1.x-dpt2.x)+
(dpt1.y-point.y)*(dpt1.y-dpt2.y))/2;
x=(int)(dpt1.x+dpt2.x)/2;
y=(int)(dpt1.y+dpt2.y)/2;
pDC->Ellipse(x-d,y-d,x+d,y+d);
ptOrg=point;//记录上次这次画圆的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
case 4:
pDC->Rectangle(ddpt1.x,ddpt1.y,ddpt2.x,ddpt2.y);
pDC->Rectangle(dpt1.x,dpt1.y,dpt2.x,dpt2.y);
ptOrg=point;//记录上次这次画矩形的终点
pDC->SelectObject(pOldPen);
delete pNewPen;
break;
default:
break;
}
// L.DrawAll(pDC);
// movet->DrawTuyuan(pDC);
// delete movet;
}
break;
default:
break;
}
}
CView::OnMouseMove(nFlags, point);
}
void CDrawSempleView::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menuPopup; //声明菜单对象
if(menuPopup.CreatePopupMenu()) //创建一个弹出式菜单
{
//向菜单menuPopup 中添加菜单项
menuPopup.AppendMenu(MF_STRING,ID_DRAW_LINE,"直线(&L)\tCtrl+L");
menuPopup.AppendMenu(MF_STRING,ID_DRAW_ELLI,"椭圆(&E)\tCtrl+E");
menuPopup.AppendMenu(MF_STRING,ID_DRAW_CIRCLE,"圆(&I)\tCtrl+I");
menuPopup.AppendMenu(MF_STRING,ID_DRAW_RECT,"矩形(&T)\tCtrl+T");
//显示弹出式菜单,并对用户选择的菜单项作出响应
menuPopup.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -