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

📄 cg50view.cpp

📁 本上机平台专门为《计算机辅助设计技术基础》课程中的vC语言编程和交互技术与用户接口实验部分设计。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Cg50View.cpp : implementation of the CCg50View class
//

#include "stdafx.h"
#include "Cg50.h"

#include "Cg50Doc.h"
#include "Cg50View.h"
#include "MainFrm.h" 

#include "CgDraw.h"
#include "GridDlg.h"
#include "ArrowDlg.h"
#include "BezieDlg.h"
#include "RctglDlg.h"
#include "Housedlg.h"
#include "Phong.h"
#include "DeleteDialog.h"
#include "Dib.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern HPEN pen=NULL;
bool after=0;
extern CDIB dib;
/////////////////////////////////////////////////////////////////////////////
// CCg50View

IMPLEMENT_DYNCREATE(CCg50View, CView)

BEGIN_MESSAGE_MAP(CCg50View, CView)
	//{{AFX_MSG_MAP(CCg50View)
	ON_COMMAND(ID_EDIT_CLEAR, OnEditClear)
	ON_COMMAND(ID_VIEW_GRID, OnViewGrid)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_TIMER()
	ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
	ON_COMMAND(ID_DRAW_ARROW, OnDrawArrow)
	ON_COMMAND(ID_DRAW_BEZIER, OnDrawBezier)
	ON_COMMAND(ID_DRAW_PUBLINE, OnDrawPubline)
	ON_COMMAND(ID_DRAW_RETANGLE, OnDrawRetangle)
	ON_COMMAND(ID_DRAW_ROTATE, OnDrawRotate)
	ON_COMMAND(ID_DRAW_PALETTE, OnDrawPalette)
	ON_COMMAND(ID_DRAW_HOUSE, OnDrawHouse)
	ON_COMMAND(ID_DRAW_CLOCK, OnDrawClock)
	ON_UPDATE_COMMAND_UI(ID_DRAW_ROTATE, OnUpdateDrawRotate)
	ON_UPDATE_COMMAND_UI(ID_DRAW_PALETTE, OnUpdateDrawPalette)
	ON_UPDATE_COMMAND_UI(ID_DRAW_HOUSE, OnUpdateDrawHouse)
	ON_UPDATE_COMMAND_UI(ID_DRAW_CLOCK, OnUpdateDrawClock)
	ON_COMMAND(ID_MOUSE_DELETE, OnMouseDelete)
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
	ON_COMMAND(ID_MOUSE_UNDELETEALL, OnMouseUndeleteall)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_UPDATE_COMMAND_UI(ID_MOUSE_UNDELETEALL, OnUpdateMouseUndeleteall)
	ON_UPDATE_COMMAND_UI(ID_MOUSE_DELETE, OnUpdateMouseDelete)
	ON_COMMAND(ID_DRAW_PHONG, OnDrawPhong)
	ON_UPDATE_COMMAND_UI(ID_DRAW_PHONG, OnUpdateDrawPhong)
	ON_COMMAND(ID_PALETTE, OnPalette)
	ON_COMMAND(ID_DRAW_FREE, OnDrawFree)
	ON_UPDATE_COMMAND_UI(ID_DRAW_FREE, OnUpdateDrawFree)
	ON_WM_LBUTTONUP()
	ON_WM_SETCURSOR()
	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()

/////////////////////////////////////////////////////////////////////////////
// CCg50View construction/destruction

CCg50View::CCg50View()
{
	//规定一些CCg50View类变量的初始值
	obj = NULL;
	state = STT_SELECT;
	step = 0;
	GridPoint.x = GridPoint.y = 0;
	bDrawRotate = bDrawPalette = bDrawHouse = bDrawClock =bDrawPhong=bDrawFree=bEditRedo=bMouseUndeleteall=bdraw=false;
	bEditUndo = bMouseDelete = 0;
	newMousePoint.x=-1;
    newMousePoint.y=-1;
	Vx = 50; Vy = 50; Vz = 300;
	TimeCounter = 0;
}

CCg50View::~CCg50View()
{
	//释放链表占有的空间
	DrawObj *p;
	while(obj)
	{
		p = obj;
		obj = obj->next;
		delete p;
	}
}

BOOL CCg50View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
  
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCg50View drawing

void CCg50View::OnDraw(CDC* pDC)
{
	CCg50Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    if(after) {dib.Show(this);after=0;}
	//画格
	if(GridPoint.x)
	for(int gx=GridPoint.x; gx<1000; gx+=GridPoint.x)
		for(int gy=GridPoint.y; gy<800; gy+=GridPoint.y)
		{
			pDC->SetPixel(gx, gy, RGB(0,0,0));
		}

	CCgDraw cd;
	cd.init(pDC);
	DrawObj *p = obj;
	//窗口中有显示图形时,定义bMouseDelete为真
	bMouseDelete = true;
	if ((!p) || ((state != STT_SELECT) && (p->next == NULL))) bMouseDelete = false;
	//重绘链表中所有图形
	while(p)
	{
		if((state != STT_SELECT) && (p->next == NULL)) break;
		switch(p->type)
		{
		case OBJ_LINE:
			cd.line(pDC, p->v);
			p = p->next;
			break;
		case OBJ_ARROW:
			cd.arrow(pDC, p->v);
			p = p->next;
			break;
		case OBJ_BEZIER:
			cd.bezier(pDC, p->num, p->v);
			p = p->next;
			break;
		case OBJ_PUBLINE:
			cd.publine(pDC, p->v);
			p = p->next;
			break;
		case OBJ_RETANGLE:
			cd.retangle(pDC, p->num, p->v);
			p = p->next;
			break;
		case OBJ_DELETE:
			cd.mousedelete(pDC, p->v, p->num);
			p = p->next;
			break;
        case OBJ_PHONG:
			 cd.phong(pDC);
			 p=p->next;
			 break;
        case OBJ_FREE:
			 cd.free(pDC,oldMousePoint,newMousePoint);
			 p=p->next;
			 break;
		default:
			break;
		}
	}
	//重绘布尔变量为真的图形
    
	if(bDrawFree)
	{
  
	cd.free(pDC,oldMousePoint,newMousePoint);
	}
	if(bDrawRotate) 
	{
		cd.rotate(pDC);
	}
	if(bDrawPalette) 
	{
		cd.palette(pDC);
	}
	if(bDrawHouse) 
	{
		cd.house(pDC,Vx, Vy, Vz);
	}
	if(bDrawClock) 
	{
		cd.clock(pDC, TimeCounter);
	}
	if(bDrawPhong)
	{ 
	cd.phong(pDC);
	}
	
	extern BOOL bLoad;
	if(bLoad)
	{
	cd.load(pDC);
    } 
}

/////////////////////////////////////////////////////////////////////////////
// CCg50View printing

BOOL CCg50View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CCg50View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CCg50View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CCg50View diagnostics

#ifdef _DEBUG
void CCg50View::AssertValid() const
{
	CView::AssertValid();
}

void CCg50View::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CCg50Doc* CCg50View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCg50Doc)));
	return (CCg50Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCg50View message handlers

void CCg50View::OnEditClear() 
{
	DrawObj *p;
	while(obj)
	{
		p = obj;
		obj = obj->next;
		delete p;
	}
	state = STT_SELECT;
	bEditUndo = false;
	
	CCg50Doc *doc = GetDocument();
	doc->UpdateAllViews(NULL);	
}

void CCg50View::OnViewGrid() 
{
	DrawObj *p;
	
	if(state != STT_SELECT)
	{
		if(obj == end)
		{
			delete end;
			obj = end = NULL;
		}
		else
		{
			p = obj;
			while(p->next != end) p = p->next;
			p->next = NULL;
			delete end;
			end = p;
		}
		step = 0;
	}
	
	CGridDlg dlg;
	dlg.m_GridCheck = (GridPoint.x || GridPoint.y);
	if(dlg.m_GridCheck)
	{
		dlg.m_GridX = GridPoint.x;
		dlg.m_GridY = GridPoint.y;
	}
	else dlg.m_GridX = dlg.m_GridY = 10;
	if(dlg.DoModal() != IDOK) return ;
	if(dlg.m_GridCheck)
	{
		GridPoint.x = dlg.m_GridX;
		GridPoint.y = dlg.m_GridY;
	}
	else GridPoint.x = GridPoint.y = 0;

	CCg50Doc *doc = GetDocument();
	doc->UpdateAllViews(NULL);	
}

void CCg50View::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CCg50Doc *doc;
	switch(state)
	{
	case STT_SELECT:
		break;
	case STT_LINE:
		end->v[step].x = point.x;
		end->v[step].y = point.y;
		step++;
		if(step == 2)
		{
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
		}
		break;
	case STT_ARROW:
		end->v[step].x = point.x;
		end->v[step].y = point.y;
		step++;
		if(step == 2)
		{
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
		}
		break;
	case STT_BEZIER:
		end->v[step].x = point.x;
		end->v[step].y = point.y;
		step++;
		if(step == end->num)
		{
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
		}
		break;
	case STT_PUBLINE:
		switch(step)
		{
		case 0:
			end->v[0].x = point.x;
			end->v[0].y = point.y;
			step++;
			break;
		case 1:
			end->v[2].x = (int)sqrt((double)(end->v[0].x - point.x) * (end->v[0].x - point.x) +
						(double)(end->v[0].y - point.y) * (end->v[0].y - point.y));
			step++;
			break;
		case 2:
			end->v[1].x = point.x;
			end->v[1].y = point.y;
			step++;
			break;
		case 3:
			end->v[2].y = (int)sqrt((double)(end->v[1].x - point.x) * (end->v[1].x - point.x) +
						(double)(end->v[1].y - point.y) * (end->v[1].y - point.y));
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
			break;
		}
		break;
	case STT_RETANGLE:
		end->v[step].x = point.x;
		end->v[step].y = point.y;
		step++;
		if(step == 2)
		{
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
		}
		break;
	case STT_DELETE:
		end->v[step].x = point.x;
		end->v[step].y = point.y;
		end->num = select;
		step++;
		if(step == 2)
		{
			state = STT_SELECT;
			step = 0;
			doc = GetDocument();
			doc->UpdateAllViews(NULL);
		}
		break;
	default:
		break;
	}
	if (bDrawFree) bdraw=true;
	CView::OnLButtonDown(nFlags, point);
}

void CCg50View::OnMouseMove(UINT nFlags, CPoint point) 
{   
	switch(state)
	{
	case STT_SELECT:
		sprintf(str, "(%3d,%3d)", point.x, point.y);
		break;
	case STT_LINE:
		sprintf(str, "(%3d,%3d)  Line: locate point %d", point.x, point.y, step+1);
		break;
	case STT_ARROW:
		sprintf(str, "(%3d,%3d)  Arrow: locate point %d", point.x, point.y, step+1);
		break;
	case STT_BEZIER:
		sprintf(str, "(%3d,%3d)  Bezier: locate point %d", point.x, point.y, step+1);
		break;
	case STT_PUBLINE:
		switch(step)
		{
		case 0:
			sprintf(str, "(%3d,%3d) Public Line: locate center of circle 1", point.x, point.y);
			break;
		case 1:
			sprintf(str, "Public Line: specify radium of circle 1 (%d)",
					(int)sqrt((double)(end->v[0].x - point.x) * (end->v[0].x - point.x) +
					(double)(end->v[0].y - point.y) * (end->v[0].y - point.y)));
			break;
		case 2:
			sprintf(str, "(%3d,%3d) Public Line: locate center of circle 2", point.x, point.y);
			break;
		case 3:
			sprintf(str, "Public Line: specify radium of circle 2 (%d)",
					(int)sqrt((double)(end->v[1].x - point.x) * (end->v[1].x - point.x) +
					(double)(end->v[1].y - point.y) * (end->v[1].y - point.y)));
			break;
		}
		break;
	case STT_RETANGLE:
		sprintf(str, "(%3d,%3d)  Rectangle: locate point %d", point.x, point.y, step+1);
		break;
	case STT_DELETE:
		sprintf(str, "(%3d,%3d)  Delete: locate point %d", point.x, point.y, step+1);
		break;
	default:
		break;
	}
	CCg50App *pWinApp = (CCg50App *)AfxGetApp();
	CMainFrame *pMainFrame = (CMainFrame *)pWinApp->m_pMainWnd;
	pMainFrame->m_wndStatusBar.SetWindowText(str);
	if (bdraw)
	{
	if ((newMousePoint.x==-1)&&(newMousePoint.y==-1)) oldMousePoint=point;
	else oldMousePoint=newMousePoint;
	newMousePoint=point;
	InvalidateRect(NULL,0);
	}
	CView::OnMouseMove(nFlags, point);
}

void CCg50View::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent == 1)
	{
		TimeCounter++;
		InvalidateRect(NULL,0);
	}
	
	CView::OnTimer(nIDEvent);
}

void CCg50View::OnDrawLine() 
{
	DrawObj *p;
	bEditUndo = true;	
	dib.CaptureDIB(this);
	after=1;
	if(state != STT_SELECT)
	{
		if(obj == end)
		{
			delete end;
			obj = end = NULL;
		}
		else
		{
			p = obj;
			while(p->next != end) p = p->next;
			p->next = NULL;
			delete end;
			end = p;
		}
		step = 0;
	}
	
	if(!obj)
	{
		obj = new DrawObj;
		obj->type = OBJ_LINE;
		obj->next = NULL;
		end = obj;
	}
	else
	{
		end->next = new DrawObj;
		end = end->next;
		end->next = NULL;
		end->type = OBJ_LINE;
	}
	state = STT_LINE;
	
}

void CCg50View::OnDrawArrow() 
{
	DrawObj *p;
	bEditUndo = true;	
	dib.CaptureDIB(this);
	after=1;
	if(state != STT_SELECT)
	{
		if(obj == end)
		{
			delete end;
			obj = end = NULL;
		}
		else
		{
			p = obj;
			while(p->next != end) p = p->next;
			p->next = NULL;
			delete end;
			end = p;
		}
		step = 0;
	}
	
	CArrowDlg dlg;
	//dlg.m_OneSide.UpdateData(FALSE);
	dlg.m_arrow_length = 15;
	dlg.m_arrow_width = 5;

	if(dlg.DoModal() != IDOK) return;

//	int ArrowType;
//	if(dlg.GetCheckedRadioButton(IDC_ONESIDE_RADIO, IDC_TWOSIDE_RADIO) == IDC_ONESIDE_RADIO)
//		ArrowType = 1;
//	else ArrowType = 2;
	
	if(!obj)
	{
		obj = new DrawObj;
		end = obj;
	}
	else
	{
		end->next = new DrawObj;
		end = end->next;
	}
	end->next = NULL;
	end->type = OBJ_ARROW;
	state = STT_ARROW;
	end->v[3].x = dlg.m_type;
	end->v[2].x = dlg.m_arrow_length;
	end->v[2].y = dlg.m_arrow_width;
	
}

void CCg50View::OnDrawBezier() 
{
	DrawObj *p;
	bEditUndo = true;	
	dib.CaptureDIB(this);
	after=1;
	if(state != STT_SELECT)
	{
		if(obj == end)
		{
			delete end;
			obj = end = NULL;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -