📄 cg50view.cpp
字号:
// 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 + -