📄 draw1view.cpp
字号:
// DRAW1View.cpp : implementation of the CDRAW1View class
//
#include "stdafx.h"
#include "DRAW1.h"
#include "DRAW1Doc.h"
#include "DRAW1View.h"
#include <windowsx.h>
#include "MainFrm.h"
#include "NameDialog.h"
#include "Resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDRAW1View
IMPLEMENT_DYNCREATE(CDRAW1View, CScrollView)
BEGIN_MESSAGE_MAP(CDRAW1View, CScrollView)
//{{AFX_MSG_MAP(CDRAW1View)
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_IMAGE_PEN, OnImagePen)
ON_COMMAND(ID_SHAPE_STR_LINE, OnShapeStrLine)
ON_COMMAND(ID_BORDER_SCALE_SMALL, OnBorderScaleSmall)
ON_COMMAND(ID_COLOR_BLACK, OnColorBlack)
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_COLOR_YELLOW, OnColorYellow)
ON_COMMAND(ID_SHAPE_RECTANGLE, OnShapeRectangle)
ON_COMMAND(ID_FILL_FALSE, OnFillFalse)
ON_COMMAND(ID_SHAPE_SQUARE, OnShapeSquare)
ON_UPDATE_COMMAND_UI(ID_IMAGE_PEN, OnUpdateImagePen)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLACK, OnUpdateColorBlack)
ON_UPDATE_COMMAND_UI(ID_COLOR_YELLOW, OnUpdateColorYellow)
ON_UPDATE_COMMAND_UI(ID_BORDER_SCALE_SMALL, OnUpdateBorderScaleSmall)
ON_UPDATE_COMMAND_UI(ID_SHAPE_RECTANGLE, OnUpdateShapeRectangle)
ON_UPDATE_COMMAND_UI(ID_FILL_FALSE, OnUpdateFillFalse)
ON_COMMAND(ID_FILL_TRUE, OnFillTrue)
ON_UPDATE_COMMAND_UI(ID_FILL_TRUE, OnUpdateFillTrue)
ON_UPDATE_COMMAND_UI(ID_SHAPE_SQUARE, OnUpdateShapeSquare)
ON_COMMAND(ID_SHAPE_ELLIPSE, OnShapeEllipse)
ON_UPDATE_COMMAND_UI(ID_SHAPE_ELLIPSE, OnUpdateShapeEllipse)
ON_COMMAND(ID_SHAPE_CIRCLE, OnShapeCircle)
ON_UPDATE_COMMAND_UI(ID_SHAPE_CIRCLE, OnUpdateShapeCircle)
ON_COMMAND(ID_BORDER_SCALE_MIDDLE, OnBorderScaleMiddle)
ON_UPDATE_COMMAND_UI(ID_BORDER_SCALE_MIDDLE, OnUpdateBorderScaleMiddle)
ON_COMMAND(ID_BORDER_SCALE_LARGE, OnBorderScaleLarge)
ON_UPDATE_COMMAND_UI(ID_BORDER_SCALE_LARGE, OnUpdateBorderScaleLarge)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_COLOR_WHITE, OnColorWhite)
ON_UPDATE_COMMAND_UI(ID_COLOR_WHITE, OnUpdateColorWhite)
ON_COMMAND(ID_COLOR_GREEN, OnColorGreen)
ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, OnUpdateColorGreen)
ON_COMMAND(ID_COLOR_RED, OnColorRed)
ON_UPDATE_COMMAND_UI(ID_COLOR_RED, OnUpdateColorRed)
ON_COMMAND(ID_COLOR_BLUE, OnColorBlue)
ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, OnUpdateColorBlue)
ON_COMMAND(ID_IMAGE_ZOOM, OnImageZoom)
ON_UPDATE_COMMAND_UI(ID_IMAGE_ZOOM, OnUpdateImageZoom)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_BK_COLOR, OnBkColor)
ON_UPDATE_COMMAND_UI(ID_BK_COLOR, OnUpdateBkColor)
ON_WM_SIZE()
ON_CBN_SELCHANGE(ID_OBJ_NAME_BOX, OnSelchangeObjNameBox)
ON_BN_CLICKED(ID_OBJ_DELETE, OnObjDelete)
ON_WM_RBUTTONDOWN()
ON_BN_CLICKED(ID_OBJ_NEWNAME, OnObjNewname)
ON_UPDATE_COMMAND_UI(ID_SHAPE_STR_LINE, OnUpdateShapeStrLine)
ON_COMMAND(ID_COLOR_MORE, OnColorMore)
ON_UPDATE_COMMAND_UI(ID_COLOR_MORE, OnUpdateColorMore)
ON_BN_CLICKED(IDC_OBJ_MOVE_EAST, OnObjMoveEast)
ON_BN_CLICKED(IDC_OBJ_MOVE_WEST, OnObjMoveWest)
ON_BN_CLICKED(IDC_OBJ_MOVE_SOUTH, OnObjMoveSouth)
ON_BN_CLICKED(IDC_OBJ_MOVE_NORTH, OnObjMoveNorth)
ON_BN_CLICKED(ID_OBJ_ANTIC, OnObjAntic)
ON_BN_CLICKED(ID_OBJ_DELIC, OnObjDelic)
ON_COMMAND(ID_SHAPE_TRIANGLE, OnShapeTriangle)
ON_UPDATE_COMMAND_UI(ID_SHAPE_TRIANGLE, OnUpdateShapeTriangle)
ON_BN_CLICKED(ID_OBJ_LARGE, OnObjLarge)
ON_BN_CLICKED(ID_OBJ_SMALL, OnObjSmall)
ON_BN_CLICKED(IDC_OBJ_FILL_HAVE, OnObjFillHave)
ON_BN_CLICKED(IDC_OBJ_FILL_NONE, OnObjFillNone)
ON_BN_CLICKED(IDC_OBJ_SIZE_LARGE, OnObjSizeLarge)
ON_BN_CLICKED(IDC_OBJ_SIZE_SMALL, OnObjSizeSmall)
ON_BN_CLICKED(IDC_OBJ_ACT_HAVE, OnObjActHave)
ON_BN_CLICKED(IDC_OBJ_ACT_NONE, OnObjActNone)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDRAW1View construction/destruction
//构造函数
CDRAW1View::CDRAW1View()
{
// TODO: add construction code here
curretShape=ID_SHAPE_STR_LINE;
curretHandObj=ID_IMAGE_PEN;
curretColor=BLACK;
currectBordarScal=BORDAR_SMALL;
currectState=0;
currectFill=false;
currectState= OBJECT_STATE_NOTHING;
currectBkColor=WHITE;
currectZoom=1.0;
currectObject=NULL;
objectAll=new CList<CShape*,CShape*&>;
currectName="";
}
CDRAW1View::~CDRAW1View()
{
delete objectAll;
}
BOOL CDRAW1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// CDRAW1View printing
BOOL CDRAW1View::OnPreparePrinting(CPrintInfo* pInfo)
{
return DoPreparePrinting(pInfo);
}
void CDRAW1View::OnBeginPrinting(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDRAW1View::OnEndPrinting(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDRAW1View diagnostics
#ifdef _DEBUG
// CDRAW1View drawing
void CDRAW1View::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
CDC* pDC=GetDC();
DrawAllObject(pDC);
}
void CDRAW1View::AssertValid() const
{
CView::AssertValid();
}
void CDRAW1View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDRAW1Doc* CDRAW1View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDRAW1Doc)));
return (CDRAW1Doc*)m_pDocument;
}
#endif //_DEBUG
void CDRAW1View::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
CScrollView::OnPrepareDC(pDC, pInfo);
}
void CDRAW1View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 30;
//SetScrollSizes(MM_TEXT, sizeTotal);
currectSize =sizeTotal;
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
// TODO: Add your specialized code here and/or call the base class
}
BOOL CDRAW1View::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
// TODO: Add your specialized code here and/or call the base class
return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}
/////////////////////////////////////////////////////////////////////////
//以下为成员函数
//图画主方法
void CDRAW1View::OnDraw(CDC* pDC)
{
CDRAW1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
OnEraseBkgnd(pDC);
}
//改变背景色并重画所有对象
BOOL CDRAW1View::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBrush brush(currectBkColor);
CBrush* pOldBrush =pDC->SelectObject(&brush);
CRect rcClip ;
pDC->GetClipBox(&rcClip);
pDC->PatBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),PATCOPY);
pDC->SetBkColor(currectBkColor);
pDC->SelectObject(pOldBrush );
DrawAllObject(pDC);
return true;
}
//计算链表中某种图形最大ID
long CDRAW1View::ShapeCount(int type)
{
long shapeCount=0;
if(objectAll->GetCount()==0)return 0;
POSITION pos=objectAll->GetHeadPosition();
CShape* tempShape;
while(pos!=NULL)
{ int temp;
tempShape=objectAll->GetNext(pos);
temp=(tempShape->GetId())/SHAPE_COUNT_SCAL;
if(type==temp)
{
temp=((tempShape->GetId())%SHAPE_COUNT_SCAL);
if(temp>shapeCount)shapeCount=temp;
}
}
return shapeCount;
}
//为对象自动赋给ID
long CDRAW1View::GiveID()
{ long id=0;
long shapeCount=0;
switch(curretShape)
{
case ID_SHAPE_STR_LINE:
shapeCount=ShapeCount(0);
id=0*SHAPE_COUNT_SCAL+shapeCount+1;
break;
case ID_SHAPE_RECTANGLE:
shapeCount=ShapeCount(1);
id=1*SHAPE_COUNT_SCAL+shapeCount+1;
break;
case ID_SHAPE_SQUARE:
shapeCount=ShapeCount(2);
id=2*SHAPE_COUNT_SCAL+shapeCount+1;
break;
case ID_SHAPE_ELLIPSE:
shapeCount=ShapeCount(3);
id=3*SHAPE_COUNT_SCAL+shapeCount+1;
break;
case ID_SHAPE_CIRCLE:
shapeCount=ShapeCount(4);
id=4*SHAPE_COUNT_SCAL+shapeCount+1;
break;
case ID_SHAPE_TRIANGLE:
shapeCount=ShapeCount(5);
id=5*SHAPE_COUNT_SCAL+shapeCount+1;
break;
}
return id;
}
//为对象自动命名
CString CDRAW1View::GiveName()
{
long shapeCount;
CString name="";
switch(curretShape)
{
case ID_SHAPE_STR_LINE:
shapeCount=ShapeCount(0);
name.Format("%d",shapeCount+1);
name+="直线";
break;
case ID_SHAPE_RECTANGLE:
shapeCount=ShapeCount(1);
name.Format("%d",shapeCount+1);
name+="矩形";
break;
case ID_SHAPE_SQUARE:
shapeCount=ShapeCount(2);
name.Format("%d",shapeCount+1);
name+="正方形";
break;
case ID_SHAPE_ELLIPSE:
shapeCount=ShapeCount(3);
name.Format("%d",shapeCount+1);
name+="椭圆";
break;
case ID_SHAPE_CIRCLE:
shapeCount=ShapeCount(4);
name.Format("%d",shapeCount+1);
name+="圆";
break;
case ID_SHAPE_TRIANGLE:
shapeCount=ShapeCount(5);
name.Format("%d",shapeCount+1);
name+="三角形";
break;
}
return name;
}
//画所有对象
void CDRAW1View::DrawAllObject(CDC* pDC)
{
if(objectAll->GetCount()==0)return;
if(currectObject!=NULL)
{
currectObject->Activation(pDC,currectBkColor);
currectObject->Draw(pDC);
}
POSITION pos=objectAll->GetHeadPosition();
CShape* tempShape;
while(pos!=NULL)
{
tempShape=objectAll->GetNext(pos);
tempShape->Draw(pDC);//重画对象
}
currectObject->Activation(pDC,curretColor);//激活对象
}
//改变当前对象的名字
void CDRAW1View::OnObjNewname()
{
// TODO: Add your control notification handler code here
if(objectAll->GetCount()==0)return;//
CNameDialog newNameDlg;
newNameDlg.m_new_name=currectObject->GetName();
if(newNameDlg.DoModal()==IDOK)
{
POSITION pos=objectAll->GetHeadPosition();
CShape* tempShape;
while(pos!=NULL)
{
tempShape=objectAll->GetNext(pos);
//检测名字是否已存在
if(tempShape->GetName()==newNameDlg.m_new_name)
{AfxMessageBox("该名字已存在!");return;}
//重设链表中该对象的名字
else if(currectObject->GetId()==tempShape->GetId())
{
pos=objectAll->Find(tempShape);
objectAll->GetAt(pos)->SetName(newNameDlg.m_new_name);
break;
}
}
//重设当前对象名字
currectObject->SetName(newNameDlg.m_new_name);
//重设名字复合框内容
int post;
CMainFrame* pMainFrm;
CComboBox *p_ComBox;
pMainFrm=(CMainFrame *)AfxGetApp()->GetMainWnd();
p_ComBox=(CComboBox *)pMainFrm->m_wndDlgBar.GetDlgItem(ID_OBJ_NAME_BOX);
post=p_ComBox->GetCurSel();
p_ComBox->DeleteString(post);
p_ComBox->InsertString(post,newNameDlg.m_new_name);
p_ComBox->SetCurSel(post);//选中它
}
}
//根据名字找对象
void CDRAW1View::FindObjByName(CString objectName)
{
CDC* pDC=GetDC();
if(objectAll->GetCount()==0)return;
POSITION pos=objectAll->GetHeadPosition();
CShape* tempShape;
while(pos!=NULL)
{
tempShape=objectAll->GetNext(pos);
if(objectName==tempShape->GetName())
{
currectObject=tempShape;
break;
}
}
}
//寻找当前对象
void CDRAW1View::OnSelchangeObjNameBox()
{
// TODO: Add your control notification handler code here
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -