⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 draw1view.cpp

📁 用c++编写的简单的绘图程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -