📄 paintvw.cpp
字号:
// paintvw.cpp : implementation of the CPaintobjView class
//
#include "stdafx.h"
#include "const.h"
#include "painted.h"
#include "paintobj.h"
#include "mainfrm.h"
#include "paintdoc.h"
#include "line.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "Lineattr.h"
#include "Arcattr.h"
#include "Setscale.h"
#include "math.h"
#include "Nodeattr.h"
#include "ChangeAngle.h"
#include "InputOrigin.h"
#include "circle.h"
#include "PaintLazys.h"
#include "PaintChord.h"
#include "PaintPie.h"
#include "PaintPolygon.h"
#include "PaintRoundrect.h"
#include "PaintScp.h"
#include "PaintSide.h"
#include "square.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern int m_wscreen;//客户区宽度(逻辑坐标)
extern int m_hscreen;//客户区高度(逻辑坐标)
extern double m_xstart;
extern double m_ystart;
extern double fxmin;
extern double fymin;
extern double fxmax;
extern double fymax;
extern double fscale;
extern double fbasicscale;
extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
extern double Distance(int x1, int y1, int x2, int y2);
extern double Distancef(double x1, double y1, double x2, double y2);
extern double PointToLine(double xx,double yy,double x1,double y1,double x2,double y2);
extern double PointToLine1(CPnt p1,CPnt p2,CPnt p3,CPnt p4,BOOL bbb);
extern BOOL AngleJudge(double angle1,double angle2);
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView
IMPLEMENT_DYNCREATE(CPaintobjView, CScrollView)
BEGIN_MESSAGE_MAP(CPaintobjView, CScrollView)
//{{AFX_MSG_MAP(CPaintobjView)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_VIEW_SCROLL, OnViewScroll)
ON_UPDATE_COMMAND_UI(ID_VIEW_SCROLL, OnUpdateViewScroll)
ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOMFIT, OnUpdateViewZoomfit)
ON_COMMAND(ID_VIEW_ZOOMFIT, OnViewZoomfit)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_WM_RBUTTONDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_SIZE()
ON_COMMAND(ID_OPTION_SETORIGIN, OnOptionSetorigin)
ON_COMMAND(ID_OPTION_SETSCALE, OnOptionSetscale)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_VIEW_REVERT, OnViewRevert)
ON_WM_KEYDOWN()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_VIEW_REVERT, OnUpdateViewRevert)
ON_COMMAND(ID_OPTION_NODESTATE, OnOptionNodestate)
ON_UPDATE_COMMAND_UI(ID_OPTION_NODESTATE, OnUpdateOptionNodestate)
ON_COMMAND(ID_TOOL_JOINTWOLINES, OnToolJointwolines)
ON_UPDATE_COMMAND_UI(ID_TOOL_JOINTWOLINES, OnUpdateToolJointwolines)
ON_EN_CHANGE(IDC_ANGLE, OnChangeAngle)
ON_BN_CLICKED(IDC_CHECKED, OnChecked)
ON_EN_CHANGE(IDC_LENGTH, OnChangeLength)
ON_COMMAND(ID_SELECT_ANGLELENGTH, OnSelectAnglelength)
ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
ON_UPDATE_COMMAND_UI(ID_SELECT_ANGLELENGTH, OnUpdateSelectAnglelength)
ON_COMMAND(ID_OPTION_NODESORT, OnOptionNodesort)
ON_COMMAND(ID_EDIT_SEARCHPATH, OnEditSearchpath)
ON_COMMAND(ID_EDIT_SEARCHNODE, OnEditSearchnode)
ON_COMMAND(ID_OPTION_INPUTORIGIN, OnOptionInputorigin)
ON_COMMAND(ID_TOOL_BUILDING_JOINTWOLINES, OnToolBuildingJointwolines)
ON_UPDATE_COMMAND_UI(ID_TOOL_BUILDING_JOINTWOLINES, OnUpdateToolBuildingJointwolines)
ON_COMMAND(ID_TOOL_DEVICE_JOINTWOLINES, OnToolDeviceJointwolines)
ON_UPDATE_COMMAND_UI(ID_TOOL_DEVICE_JOINTWOLINES, OnUpdateToolDeviceJointwolines)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView construction/destruction
CPaintobjView::CPaintobjView()
{
CWinApp* pApp = AfxGetApp();
m_bZoomMode = FALSE;
m_bSetorigin= FALSE;//设置原点
m_bTracking = FALSE;
m_pSearchPath = NULL;
m_pSearchNode = NULL;
m_hcurArrow = pApp->LoadStandardCursor(IDC_ARROW);
m_hcurCross = pApp->LoadStandardCursor(IDC_CROSS);
m_hcurMove= pApp->LoadCursor(IDC_CURSORMOVE);//移动光标句柄
m_hcurZoomin= pApp->LoadCursor(IDC_CURSORZOOMIN);//缩小光标句柄
m_hcurZoomout= pApp->LoadCursor( IDC_CURSORZOOMOUT);//放大光标句柄
m_hcurSetorigin= pApp->LoadCursor( IDC_CURSORSETORIGIN);//设置原点光标句柄
m_hcurChange= pApp->LoadCursor( IDC_CURSORCHANGE);//端点重合时光标句柄
m_hcurNodeattr= pApp->LoadCursor( IDC_CURSORNODEATTR);//编辑节点光标句柄
m_npushnumber=0;
ASSERT(m_hcurArrow != NULL);
ASSERT(m_hcurCross != NULL);
// Win95 has IDC_SIZEALL, WinNT 3.51 has IDC_SIZE
// m_hcurSize = pApp->LoadStandardCursor(IDC_SIZEALL);
// if (m_hcurSize == NULL)
// pApp->LoadStandardCursor(IDC_SIZE);
// ASSERT(m_hcurSize != NULL);
}
CPaintobjView::~CPaintobjView()
{
}
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView drawing
void CPaintobjView::OnDraw(CDC* pDC)
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_bDisNodeState)//显示节点自检结果
{
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
CPainted* pPainter =(CPainted*) pDoc->GetShape(index);
if(pPainter->m_uObjectType==0)//如果是路径则进行节点状态显示
{
pPainter->DrawSpecialNode(pDC);
}
else//如果不是路径则不进行节点状态显示
{
pPainter->Draw(pDC);
}
}
}
else
{
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
CPainted* pPainter =(CPainted*) pDoc->GetShape(index);
if(pPainter->m_bSelect)
pPainter->DrawSelected(pDC,this);
else
pPainter->Draw(pDC);
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView printing
BOOL CPaintobjView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
CRect rect;
rect.left=0;
rect.top=0;
rect.bottom=600;
rect.right=800;
pInfo->m_rectDraw=rect;
return DoPreparePrinting(pInfo);
}
void CPaintobjView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CPaintobjView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView diagnostics
#ifdef _DEBUG
void CPaintobjView::AssertValid() const
{
CScrollView::AssertValid();
}
void CPaintobjView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CPaintobjDoc* CPaintobjView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPaintobjDoc)));
return (CPaintobjDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView message handlers
void CPaintobjView::OnLButtonDown(UINT nFlags, CPoint point)
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
CPnt pnt;
VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标
if (pDoc->m_pSelectedTool == NULL)
{
if(m_bSetorigin)
{
::SetCursor(m_hcurSetorigin);
}
else if(pDoc->m_bMove)//移动图形
{
::SetCursor(m_hcurMove);
}
else if(pDoc->m_bZoomIn)
{
::SetCursor(m_hcurZoomin);
}
else if(pDoc->m_bZoomOut)
{
::SetCursor(m_hcurZoomout);
}
else
::SetCursor(m_hcurArrow);
}
if(pDoc->m_bpaintLine)
{
SetCapture();
m_bTracking = TRUE;
CPnt pntt;
double angle;
UINT id;
if(pDoc->m_PathPaintMode==1||pDoc->m_PathPaintMode==2)//路径的绘制模式
{
pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
}
((CPaintLine*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
BOOL yy=((CPaintLine*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
if(yy==FALSE)//return FALSE表示无就近点
{
pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
}
else //return TRUE表示有就近点
{
pDoc->m_uCurStartnodeId=id;
pDoc->m_pSelectedTool->m_uStartNodeId=id;
pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
pnt=pntt;
}
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintarc)
{
if(m_npushnumber==0)
{
SetCapture();
CPnt pntt;
double angle;
UINT id;
if(pDoc->m_PathPaintMode==6||pDoc->m_PathPaintMode==7||pDoc->m_PathPaintMode==10||pDoc->m_PathPaintMode==11)//路径的绘制模式
{
pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
}
((CPaintArc*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;//
BOOL yy=((CPaintArc*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
if(yy==FALSE)//return FALSE表示无就近点
{
pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
}
else //return TRUE表示有就近点
{
pDoc->m_uCurStartnodeId=id;
pDoc->m_pSelectedTool->m_uStartNodeId=id;
pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
pnt=pntt;
}
pDoc->m_pSelectedTool->OnDown(pnt);
m_npushnumber++;
}
else if(m_npushnumber==1)
{
int aa;
aa=((CPaintArc*) pDoc->m_pSelectedTool)->GetArcCirclecenter1(pnt,pDoc);
pDoc->m_pSelectedTool->OnDown2(pnt);
((CPaintArc*) pDoc->m_pSelectedTool)->DragDrawCircle(&ClientDC,pnt,pDoc);
m_npushnumber++;
}
else if(m_npushnumber==2)
{
m_bTracking = TRUE;
BOOL eee;
((CPaintArc*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
eee=((CPaintArc*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
pDoc->m_bEndnodeIndep=!eee;//TRUE==独立
pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
}
}
else if(pDoc->m_bpaintChord)//TRUE表示正在画弦
{
if(m_npushnumber==0)
{
SetCapture();
CPnt pnt2;
((CPaintChord*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintChord*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
pDoc->m_pSelectedTool->OnDown(pnt);
m_npushnumber++;
}
else if(m_npushnumber==1)
{
((CPaintChord*) pDoc->m_pSelectedTool)->GetChordCirclecenter(pnt,pDoc);
pDoc->m_pSelectedTool->OnDown2(pnt);
m_npushnumber++;
}
else if(m_npushnumber==2)
{
m_bTracking = TRUE;
((CPaintChord*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintChord*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
}
}
else if(pDoc->m_bpaintEllipse)//TRUE表示正在画椭圆
{
SetCapture();
m_bTracking = TRUE;
CPnt pnt2;
((CPaintEllipse*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintEllipse*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintLazys)//TRUE表示正在画懒-S
{
SetCapture();
m_bTracking = TRUE;
CPnt pntt;
double angle=0;
UINT id;
if(pDoc->m_LazysPaintMode==1||pDoc->m_LazysPaintMode==2)//路径的绘制模式
{
pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
}
((CPaintLazys*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
BOOL yy=((CPaintLazys*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
if(yy==FALSE)//return FALSE表示无就近点
{
pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
}
else //return TRUE表示有就近点
{
pDoc->m_uCurStartnodeId=id;
pDoc->m_pSelectedTool->m_uStartNodeId=id;
pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
pnt=pntt;
}
if(pDoc->m_bGetangleMode)//FALSE表示自动取角
{
((CPaintLazys*) pDoc->m_pSelectedTool)->m_angStart=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
}
else
{
((CPaintLazys*) pDoc->m_pSelectedTool)->m_angStart=angle;// 起点的倾斜角(世界坐标系中)
}
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintPie)//TRUE表示正在画扇形
{
if(m_npushnumber==0)
{
SetCapture();
CPnt pnt2;
((CPaintPie*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintPie*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
pDoc->m_pSelectedTool->OnDown(pnt);
m_npushnumber++;
}
else if(m_npushnumber==1)
{
((CPaintPie*) pDoc->m_pSelectedTool)->GetPieCirclecenter(pnt,pDoc);
pDoc->m_pSelectedTool->OnDown2(pnt);
m_npushnumber++;
}
else if(m_npushnumber==2)
{
m_bTracking = TRUE;
((CPaintPie*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintPie*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
}
}
else if(pDoc->m_bpaintPolygon)//TRUE表示正在画多边形
{
if(pDoc->m_PolygonPaintMode==0)//鼠标拖拽画法
{
m_bTracking = TRUE;
pDoc->PointXY[m_npushnumber].x=pnt.x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -