www.pudn.com > DrawVector.rar > DrawView.cpp


// DrawView.cpp : implementation of the CDrawView class 
// 
 
#include "stdafx.h" 
#include "Draw.h" 
 
#include "DrawDoc.h" 
#include "DrawView.h" 
#include "math.h" 
#define pi 3.1415926 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView 
//CGraphPara *p_GraphPara; 
IMPLEMENT_DYNCREATE(CDrawView, CView) 
 
BEGIN_MESSAGE_MAP(CDrawView, CView) 
	//{{AFX_MSG_MAP(CDrawView) 
	ON_WM_SIZE() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_RBUTTONDOWN() 
	ON_COMMAND(ID_DRAW_ARC,OnDrawArc) 
	ON_COMMAND(ID_DRAW_CIRCLE,OnDrawCircle) 
	ON_COMMAND(ID_DRAW_CIRCLE1,OnDrawCircle1) 
    ON_COMMAND(ID_DRAW_LINE,OnDrawLine) 
	ON_COMMAND(ID_DRAW_PLINE,OnDrawPline) 
	ON_COMMAND(ID_DRAW_RGN,OnDrawPlineRgn) 
	ON_COMMAND(ID_DRAW_TEXT,OnDrawText) 
	ON_COMMAND(ID_DRAW_NET,OnDrawNet) 
	ON_COMMAND(ID_DRAW_NET_LINK,OnDrawNetLink) 
	ON_COMMAND(ID_GRAPH_REDRAW, OnGraphRedraw) 
	ON_COMMAND(ID_GRAPH_ZOOM, OnGraphZoom) 
	ON_COMMAND(ID_GRAPH_PAN, OnGraphPan) 
	ON_COMMAND(ID_GRAPH_UP, OnGraphUp) 
	ON_COMMAND(ID_GRAPH_FIRST, OnGraphFirst) 
	ON_COMMAND(ID_GRAPH_ALL, OnGraphAll) 
	ON_COMMAND(ID_SELECT_MOUSE, OnSelectMouse) 
	ON_COMMAND(ID_SELECT_CLEAR, OnSelectClear) 
	ON_COMMAND(ID_EDIT_MOVE, OnEditMove) 
	ON_COMMAND(ID_SELECT_DELETE, OnSelectDelete) 
	//}}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) 
	ON_COMMAND(ID_TEXT_MESSAGE,DrawText) 
	ON_COMMAND(ID_TEXT_ONOK,DrawTextOnOk) 
	ON_COMMAND(ID_TEXT_ONCANCEL,DrawTextOnCancel) 
END_MESSAGE_MAP() 
CDrawView *p_View; 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView construction/destruction 
void DPtoVP(float x,float y,int *X,int *Y); 
void VPtoDP(int x,int y,float *X,float *Y); 
int DLtoVL(float l); 
float VLtoDL(int l); 
extern float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen; 
 
 
void DPtoVP(float x,float y,int *X,int *Y) 
{ 
	p_View->DPtoVP(x,y,X,Y); 
} 
void VPtoDP(int x,int y,float *X,float *Y) 
{ 
	p_View->VPtoDP(x,y,X,Y); 
} 
int DLtoVL(float l) 
{ 
	return p_View->DLtoVL(l); 
} 
float VLtoDL(int l) 
{ 
	return p_View->VLtoDL(l); 
} 
 
 
CDrawView::CDrawView() 
{ 
	// TODO: add construction code here 
	m_xStart=0.0; 
	m_yStart=0.0; 
	blc=1.0; 
 
	m_pColor=1;//设置笔色 
	m_bColor=0;//当前底色的序号 
	m_brColor=1;//设置填充色 
	m_LineWide=1.0;//设置线宽 
	m_LineType=0;//设置线型 
	m_Layer=1;//选择当前图层 
 
	PointXyz=new PointStruct[10000]; 
	pTextDlg=NULL; 
	//以下设置初始字体大小 
	m_FontHeight=20; 
	m_FontWide=10; 
	m_TextAngle=0; 
	m_FontAngle=0; 
	m_FontBetween=1; 
	m_TextString.Empty(); 
	m_Text1=new CText();//创建一个标注文本对象 
} 
 
CDrawView::~CDrawView() 
{ 
	delete PointXyz; 
	delete m_Text1; 
} 
 
BOOL CDrawView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView drawing 
void CDrawView::VPtoDP(int x,int y,float *X,float *Y) 
{ 
	*X=m_xStart+x*blc; 
	if(m_MapMode==1) 
		*Y=m_yStart+blc*(m_hScreen-y); 
	else 
		*Y=m_yStart+blc*(y+m_hScreen); 
} 
void CDrawView::DPtoVP(float x,float y,int *X,int *Y) 
{ 
	*X=(int)((x-m_xStart)/blc); 
	if(m_MapMode==1) 
		*Y=m_hScreen-(int)((y-m_yStart)/blc); 
	else 
		*Y=(int)((y-m_yStart)/blc)-m_hScreen; 
} 
float CDrawView::VLtoDL(int l) 
{ 
	return blc*l; 
} 
int CDrawView::DLtoVL(float l) 
{ 
	return (int)(l/blc); 
} 
void CDrawView::OnSize(UINT nType,int cx,int cy) 
{ 
	m_wScreen=cx; 
	m_hScreen=cy; 
	CView::OnSize(nType,cx,cy); 
 
} 
void CDrawView::DrawBack(CDC* pDC) 
{ 
	CGraphPara m_GraphPara; 
    CGraphPara *p_GraphPara; 
	p_GraphPara=&m_GraphPara; 
	CBrush brush(p_GraphPara->GetColor(m_bColor)); 
	CBrush* pOldBrush=pDC->SelectObject(&brush); 
	pDC->PatBlt(0,0,m_wScreen,m_hScreen,PATCOPY); 
	pDC->SelectObject(pOldBrush); 
} 
 
void CDrawView::OnDraw(CDC* pDC) 
{ 
	CDrawDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	xMinScreen=m_xStart; 
	yMinScreen=m_yStart; 
	xMaxScreen=xMinScreen+blc*m_wScreen; 
	yMaxScreen=yMinScreen+blc*m_hScreen; 
    DrawBack(pDC); 
    int a=m_bColor; 
	pDoc->Draw(pDC,0,0,m_bColor); 
	m_MapMode=pDC->SetMapMode(1); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView printing 
 
BOOL CDrawView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView diagnostics 
 
#ifdef _DEBUG 
void CDrawView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CDrawView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CDrawDoc* CDrawView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawDoc))); 
	return (CDrawDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDrawView message handlers 
extern CGraphPara *p_GraphPara; 
 
 
void CDrawView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	p_View=this; 
	CDrawDoc* pDoc=(CDrawDoc*)GetDocument(); 
	p_Screen=pDoc->m_Screen; 
	CView::OnActivateView(bActivate, pActivateView, pDeactiveView); 
} 
 
void CDrawView::OnPrint(CDC* pDC, CPrintInfo* pInfo)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	CPaintDC dc(this); 
	OnPrepareDC(&dc); 
	OnDraw(&dc); 
	 
	CView::OnPrint(pDC, pInfo); 
} 
 
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CDrawDoc* pDoc=GetDocument(); 
	CClientDC ddd(this); 
	CPen pen(0,0,RGB(0,0,0)); 
	CPen* pOldPen=ddd.SelectObject(&pen);//在绘图对象中选择CPen对象 
	ddd.SetROP2(R2_NOT); 
	BOOL pb; 
	int x1,y1; 
	CArc m_Arc1; 
	if(m_DrawCurrent==1&&PushNumb==1)//直线 
	{ 
		if(mPointOld!=point) 
		{ 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(mPointOld); 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(point); 
			mPointOld=point; 
		} 
	} 
	else if((m_DrawCurrent==2||m_DrawCurrent==3)&&PushNumb>=1) 
	{ 
		if(mPointOld!=point) 
		{ 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(mPointOld); 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(point); 
			mPointOld=point; 
		} 
	} 
	else if((m_DrawCurrent==4||m_DrawCurrent==5)&&PushNumb>=1) 
		//如果正在绘制圆或填充圆,并且已经按下圆心点 
	{ 
		if(mPointOld!=point) 
		{ 
			if(m_DrawCurrent==4) 
			{ 
				ddd.SelectStockObject(NULL_BRUSH); 
			} 
			r=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2)); 
			ddd.Ellipse(mPointOrign.x-r,mPointOrign.y-r,mPointOrign.x+r,mPointOrign.y+r); 
			r=(int)sqrt(pow((long)(mPointOrign.x-point.x),2)+pow((float)(mPointOrign.y-point.y),2)); 
			ddd.Ellipse(mPointOrign.x-r,mPointOrign.y-r,mPointOrign.x+r,mPointOrign.y+r); 
			mPointOld=point; 
		} 
		//Invalidate(); 
 
 
	} 
	else if(m_DrawCurrent==6)//圆弧 
	{ 
		if(PushNumb==2&&mPointOld!=point) 
		{ 
    			if(DrawArcYes) 
				m_Arc1.Draw(&ddd,1,0,m_bColor); 
 			pb=jsarc(mPointOrign1,mPointOrign,point,&m_CircleX,&m_CircleY,&m_CircleR,&m_Angle1,&m_Angle2); 
			if(pb) 
			{ 
				m_Arc1.Init(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,0,m_CircleX,m_CircleY,m_CircleR,m_Angle1,m_Angle2); 
				m_Arc1.Draw(&ddd,1,0,m_bColor); 
			} 
			DrawArcYes=pb; 
			mPointOld=point; 
		} 
	//	Invalidate(); 
	} 
	else if(m_DrawCurrent==10&&PushNumb==1) 
	{ 
		if(mPointOld!=point) 
		{ 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(mPointOld); 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(point); 
			mPointOld=point; 
		} 
	} 
	else if((m_DrawCurrent==11||m_DrawCurrent==12)&&PushNumb==1) 
	{ 
		if(point!=mPointOld) 
		{ 
			if(m_DrawCurrent==11)//放大 
			{ 
				ddd.SelectStockObject(NULL_BRUSH); //设置不填充状态 
				ddd.Rectangle(mPointOrign.x,mPointOrign.y,mPointOld.x,mPointOld.y); 
				ddd.Rectangle(mPointOrign.x,mPointOrign.y,point.x,point.y); 
			} 
			else  
			{ 
				ddd.MoveTo(mPointOrign);ddd.LineTo(mPointOld); 
				ddd.MoveTo(mPointOrign);ddd.LineTo(point);  //画新的橡皮线 
			} 
			mPointOld=point; 
		} 
	} 
	else if(m_DrawCurrent==19) 
	{ 
		if(point!=mPointOld&&PushNumb>0) 
		{ 
			x1=VLtoDL(point.x-mPointOld.x); 
			y1=-VLtoDL(point.y-mPointOld.y); 
			x_Move+=x1; 
			y_Move+=y1; 
			for(int i=0;in_GraphSelect;i++) 
				pDoc->DrawGraph(&ddd,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index,1,1,0); 
			for( i=0;in_GraphSelect;i++) 
			{ 
				CDraw* pDraw=pDoc->GetGraph(pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index); 
				pDraw->Move(x1,y1); 
				pDraw->Draw(&ddd,1,1,0); 
			} 
		} 
		mPointOld=point; 
	} 
 
	 
	CView::OnMouseMove(nFlags, point); 
} 
 
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CDrawDoc* pDoc=GetDocument(); 
	CClientDC ht(this); 
	float r; 
	float xx1,yy1,xx2,yy2; 
	int x1,x2,y1,y2,Lb,index,pbh,id_only; 
	float BackColor; 
	BOOL m_bFill; 
	int id; 
	int m_sNetID; 
	//画直线 
	if(m_DrawCurrent==1) 
	{ 
		if(PushNumb==0) 
		{ 
			PushNumb++; 
			mPointOrign=point; 
			mPointOld=point; 
			SetCapture(); 
		} 
		else if(PushNumb==1) 
		{ 
			VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1); 
			VPtoDP(point.x,point.y,&xx2,&yy2); 
			id_only=pDoc->GetGraphID(1); 
			int b=m_pColor; 
			CLine* pLine=pDoc->AddLine(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only,xx1,yy1,xx2,yy2); 
			pLine->Draw(&ht,0,0,m_bColor); 
			PushNumb=0; 
			ReleaseCapture(); 
		} 
	} 
	//连续直线或者多边形区域 
	else if(m_DrawCurrent==2||m_DrawCurrent==3) 
	{ 
		PointXyz[PushNumb].x=m_xStart+blc*point.x; 
		PointXyz[PushNumb].y=m_yStart+blc*(m_hScreen-point.y); 
		if(PushNumb==0) 
		{ 
			SetCapture(); 
			mPointOrign=point; 
			mPointOld=point; 
		} 
		else 
		{ 
			mPointOrign=mPointOld; 
			mPointOld=point; 
		} 
		PushNumb++;//记录按下鼠标左键的次数 
	} 
	else if(m_DrawCurrent==4||m_DrawCurrent==5)//圆或者填充圆 
	{ 
		if(PushNumb==0) 
		{ 
			mPointOrign=point; 
			mPointOld=point; 
			PushNumb++; 
            SetCapture(); 
		} 
		else 
		{ 
			r=(float)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2)); 
			VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1); 
			if(m_DrawCurrent==4) 
				m_bFill=0; 
			else 
				m_bFill=1; 
			id_only=pDoc->GetGraphID(3); 
			int a=m_pColor; 
			pDoc->AddCircle(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only,xx1,yy1,r,m_bFill)->Draw(&ht,0,0,m_bColor); 
			PushNumb=0; 
			ReleaseCapture(); 
		} 
	} 
	else if(m_DrawCurrent==6)//圆弧 
	{ 
		if(PushNumb==0) 
		{ 
			SetCapture(); 
			DrawArcYes=0; 
			mPointOrign1=point; 
			PushNumb++; 
		} 
		else if(PushNumb==1) 
		{ 
			mPointOrign=point; 
			PushNumb++; 
		} 
		else 
		{ 
			jsarc(mPointOrign1,mPointOrign,point,&m_CircleX,&m_CircleY,&m_CircleR,&m_Angle1,&m_Angle2); 
			id_only=pDoc->GetGraphID(4); 
			pDoc->AddArc(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only,m_CircleX,m_CircleY,m_CircleR,m_Angle1,m_Angle2)->Draw(&ht,0,0,m_bColor); 
			PushNumb=0; 
			ReleaseCapture(); 
            Invalidate(); 
		} 
	 
	} 
	else if(m_DrawCurrent==7)//标注文本的交互绘制 
	{ 
		VPtoDP(point.x,point.y,&m_TextX,&m_TextY); 
		if(!pTextDlg) 
		{ 
			pTextDlg=new TextWriteDlg(this,m_TextString); 
			ASSERT(pTextDlg); 
		} 
		if(!(pTextDlg->IsOpen())) 
			pTextDlg->Create(IDD_WRITE_TEXT,this); 
		if(!(pTextDlg->IsVisible())) 
			pTextDlg->ShowWindow(SW_SHOW); 
	} 
	else if(m_DrawCurrent==8) 
	{ 
		VPtoDP(point.x,point.y,&xx1,&yy1); 
		id=pDoc->GetGraphID(8); 
		pDoc->AddNetPoint(xx1,yy1,3,m_Layer,id,m_pColor)->Draw(&ht,0,0,1); 
		PushNumb=0; 
		ReleaseCapture(); 
	} 
	else if(m_DrawCurrent==9) 
	{ 
		VPtoDP(point.x,point.y,&xx1,&yy1); 
		int nn1=pDoc->PointSelect(8,xx1,yy1,blc,&Lb,&index,&pbh); 
		if(nn1>0) 
		{ 
			if(PushNumb==0) 
			{ 
				PushNumb++; 
				m_sNetID=pbh; 
				mPointOrign=point; 
				mPointOld=point; 
				SetCapture(); 
			} 
			else if(PushNumb==1) 
			{ 
				ht.MoveTo(mPointOrign); 
				ht.LineTo(point); 
				pDoc->AddNetLink(m_sNetID,pbh)->Draw(&ht,0,0,m_bColor); 
				PushNumb=0; 
				ReleaseCapture(); 
			} 
		} 
	} 
	else if(m_DrawCurrent==11||m_DrawCurrent==12) 
	{ 
		if(PushNumb==0) 
		{ 
			mPointOrign=point;  //原点等于按中点 
			mPointOld=point; 
			PushNumb++; 
			SetCapture(); 
		} 
		else if(PushNumb==1) 
		{ 
			if(m_DrawCurrent==11)//图形放大 
			{ 
				x1=min(mPointOrign.x,point.x); 
				y1=max(mPointOrign.y,point.y); 
				x2=max(mPointOrign.x,point.x); 
				y2=min(mPointOrign.y,point.y); 
				VPtoDP(x1,y1,&m_xStart,&m_yStart);//得到视图屏幕原点实际坐标 
				//改变原点的坐标 
				m_xStart=m_xStart+blc*x1; 
				m_yStart=m_yStart+blc*(m_hScreen-y1); 
				//改变比例 
				float b11=(float)m_wScreen/(float)(x2-x1); 
				float b12=(float)m_hScreen/(float)(y1-y2); 
//				float b11=(float)(x2-x1)/(float)m_wScreen; 
//				float b12=(float)(y2-y1)/(float)m_hScreen; 
				if(b12AddScreen(m_xStart,m_yStart,blc); 
			ReleaseCapture(); 
			Invalidate(); 
		} 
	} 
	else if(m_DrawCurrent==19) 
	{ 
		if(PushNumb=0) 
		{ 
			x_Move=0; 
			y_Move=0; 
			mPointOrign=point; 
			mPointOld=point; 
			PushNumb++; 
			SetCapture(); 
		} 
		else if(PushNumb==1) 
		{ 
			PushNumb=0; 
			ReleaseCapture(); 
			m_DrawCurrent=0; 
			Invalidate(); 
		} 
	} 
	else if(m_DrawCurrent==30)//实现点选图形元素的功能 
	{ 
		if(pDoc->n_GraphSelect==10000) 
		{ 
			AfxMessageBox("最多只能选择10000个图形元素"); 
			return ; 
		} 
		VPtoDP(point.x,point.y,&xx1,&yy1); 
		float j1=blc*4; 
		BOOL pb=pDoc->PointSelect(xx1,yy1,j1,blc,&Lb,&index,&id_only); 
		if(pb) 
		{ 
			BOOL pb1=pDoc->AddSelectList(Lb,index,id_only); 
			if(pb1) 
				pDoc->DrawGraph(&ht,Lb,index,0,1,BackColor); 
		//		pDoc->DrawGraph(&ht,Lb,index,0,1); 
		} 
	} 
	 
//	CView::OnLButtonDown(nFlags, point); 
} 
 
void CDrawView::OnRButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CDrawDoc* pDoc=GetDocument(); 
	CClientDC ddd(this); 
	CPen pen(0,0,RGB(0,0,0)); 
	CPen* pOldPen=ddd.SelectObject(&pen); 
	ddd.SetROP2(R2_NOT); 
	int id_only; 
	CArc m_Arc1; 
	if(m_DrawCurrent==1&&PushNumb==1) 
	{ 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(mPointOld); 
			PushNumb=0; 
			ReleaseCapture(); 
	} 
	else if((m_DrawCurrent==2||m_DrawCurrent==3)&&PushNumb>0) 
	{ 
		ddd.MoveTo(mPointOrign); 
		ddd.LineTo(mPointOld); 
		if(m_DrawCurrent==2&&PushNumb>1) 
		{ 
			id_only=pDoc->GetGraphID(2); 
			pDoc->AddPLine(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only,PushNumb,PointXyz)->Draw(&ddd,0,0,m_bColor); 
			ReleaseCapture(); 
		} 
		else if(m_DrawCurrent==3&&PushNumb>2) 
		{ 
			id_only=pDoc->GetGraphID(2); 
			pDoc->AddPLineRgn(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only,PushNumb,PointXyz,0,1)->Draw(&ddd,0,0,m_bColor); 
			ReleaseCapture(); 
		} 
		PushNumb=0; 
		ReleaseCapture(); 
	} 
	else if((m_DrawCurrent==4||m_DrawCurrent==5)&&PushNumb>0) 
	{ 
		if(m_DrawCurrent==4) 
			ddd.SelectStockObject(NULL_BRUSH); 
		r=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2)); 
        ddd.Ellipse(mPointOrign.x-r,mPointOrign.y-r,mPointOrign.x+r,mPointOrign.y+r); 
		ReleaseCapture(); 
		PushNumb=0; 
 
	} 
	else if(m_DrawCurrent==6&&PushNumb>0) 
	{ 
		if(PushNumb==2) 
			m_Arc1.Draw(&ddd,1,0,m_bColor); 
		PushNumb=0; 
		ReleaseCapture(); 
	} 
	else if(m_DrawCurrent==9&&PushNumb==1) 
	{ 
		ddd.MoveTo(mPointOrign); 
		ddd.LineTo(mPointOld); 
		PushNumb=0; 
		ReleaseCapture(); 
	} 
	else if((m_DrawCurrent==11||m_DrawCurrent==12)&&PushNumb==1) 
	{ 
		ddd.SelectStockObject(NULL_BRUSH); 
		if(m_DrawCurrent==11) 
			ddd.Rectangle(mPointOrign.x,mPointOrign.y,point.x,point.y); 
		else  
		{ 
			ddd.MoveTo(mPointOrign); 
			ddd.LineTo(point); 
		} 
		ReleaseCapture(); 
		PushNumb=0; 
	} 
	else if(m_DrawCurrent==19&&PushNumb>0) 
	{ 
		for(int i=0;in_GraphSelect;i++) 
			pDoc->DrawGraph(&ddd,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index,1,1,0); 
		for(i=0;in_GraphSelect;i++) 
			pDoc->GetGraph(pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index)->Move(-x_Move,-y_Move); 
		ReleaseCapture(); 
		PushNumb=0; 
	//	m_bPopup=1; 
		Invalidate(); 
	} 
	ddd.SelectObject(pOldPen);//恢复原来的画笔 
	 
	CView::OnRButtonDown(nFlags, point); 
} 
void CDrawView::OnDrawLine() 
{ 
	PushNumb=0; 
	m_DrawCurrent=1; 
} 
void CDrawView::OnDrawCircle() 
{ 
	PushNumb=0; 
	m_DrawCurrent=4; 
} 
void CDrawView::OnDrawCircle1() 
{ 
	PushNumb=0; 
	m_DrawCurrent=5; 
} 
void CDrawView::OnDrawArc() 
{ 
	PushNumb=0; 
	m_DrawCurrent=6; 
} 
void CDrawView::OnDrawText() 
{ 
	PushNumb=0; 
	m_DrawCurrent=7; 
} 
void CDrawView::OnDrawPline() 
{ 
	PushNumb=0; 
	m_DrawCurrent=2; 
} 
void CDrawView::OnDrawPlineRgn() 
{ 
	PushNumb=0; 
	m_DrawCurrent=3; 
} 
void CDrawView::OnDrawNet() 
{ 
	PushNumb=0; 
	m_DrawCurrent=8; 
} 
void CDrawView::OnDrawNetLink() 
{ 
	PushNumb=0; 
	m_DrawCurrent=9; 
} 
BOOL CDrawView::jsarc(CPoint p1,CPoint p2,CPoint p3,float *CircleX,float *CircleY,float *CircleR,float *Angle1,float *Angle2) 
{ 
	float an1,an2,an3,k1,k2; 
	float x1,y1,x2,y2,x3,y3,xx1,xx2,yy1,yy2,xx,yy,rr; 
	x1=(float)p1.x;y1=(float)p1.y;x2=(float)p2.x;//将三个点的变量赋值给浮点变量 
	y2=(float)p2.y;x3=(float)p3.x;y3=(float)p3.y; 
	if(x1==x2&&y1==y2||x1==x3&&y1==y3||x2==x3&&y2==y3)//如果有两个点的坐标相同 
		return FALSE;          //操作不成功,返回FALSE 
	xx1=(x1+x2)/2;yy1=(y1+y2)/2; 
	xx2=(x2+x3)/2;yy2=(y2+y3)/2; 
	if(fabs(y2-y1)>0.5)   //如果第一条直线段的垂线不是竖直线 
		k1=-(x2-x1)/(y2-y1); 
	if(fabs(y3-y2)>0.5) 
		k2=-(x3-x2)/(y3-y2); 
	if(k1==k2&&k1==0.0) 
		return 0; 
	if(fabs(y2-y1)<0.5) 
	{ 
		xx=xx1; 
		if(fabs(y3-y2)<0.5) 
		{ 
			yy=y2+10000; 
			rr=10000; 
		} 
		else  
		{ 
			yy=yy2+k2*(xx2-xx); 
			rr=yy-y2; 
			if(rr<0) 
				rr=-rr; 
		} 
	} 
	else if(fabs(y2-y3)<0.5) 
	{ 
		yy=yy1+k1*(xx1-xx); 
		rr=yy-y2; 
		if(rr<0) 
			rr=-rr; 
	} 
	else  
	{ 
		if(k1==k2) 
		{ 
			xx=x2+(float)(10000/sqrt(1+k1*k1)); 
			yy=y2+(float)(10000/sqrt((1+k1*k1)/(k1*k1))); 
			rr=10000; 
		} 
		else 
		{ 
			xx=(yy2-yy1+k1*xx1-k2*xx2)/(k1-k2); 
			yy=yy1+k1*(xx-xx1); 
			rr=(float)sqrt((xx-x1)*(xx-x1)+(yy-y1)*(yy-y1)); 
		} 
	} 
	*CircleX=m_xStart+blc*xx; 
	*CircleY=m_yStart+blc*(m_hScreen-yy)*blc; 
	*CircleR=blc*rr; 
	an1=(float)acos((x1-xx)/rr); 
	if(y1-yy>0) 
		an1=(float)(pi*2-an1); 
	an2=(float)acos((x2-xx)/rr); 
	if(y2-yy>0) 
		an2=(float)(pi*2-an2); 
	an3=(float)acos((x3-xx)/rr); 
	if(y3-yy>0) 
		an3=(float)(pi*2-an3); 
	if(an2>an1&&an2m_Text;  //从标注文本对话框中得到标注文本内容 
    m_Text1->Init(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,m_TextX,m_TextY,m_TextAngle,m_FontAngle,m_FontHeight,m_FontWide,m_FontBetween,0,m_TextString); 
	m_Text1->Draw(&ht,0,0,m_bColor);//绘制标准文本 
} 
void CDrawView::DrawTextOnOk() 
{ 
	CDrawDoc* pDoc=GetDocument(); 
	CClientDC ht(this); 
	int TextLong; 
	PushNumb=0; 
	m_TextString=pTextDlg->m_Text; 
	TextLong=m_TextString.GetLength(); 
	if(TextLong>0) 
	{ 
		int id_only=pDoc->GetGraphID(5); 
		pDoc->AddText(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id_only, 
			m_TextX,m_TextY,m_TextAngle,m_FontAngle,m_FontHeight,m_FontWide, 
			m_FontBetween,0,TextLong,m_TextString)->Draw(&ht,0,0,m_bColor); 
		pTextDlg->m_Text.Empty();    //晴空字符串内容 
		pTextDlg->SendMessage(WM_INITDIALOG); 
 
	} 
} 
void CDrawView::DrawTextOnCancel() 
{ 
	pTextDlg->m_Text.Empty();//晴空标注文本对话框中编辑框内的内容 
	pTextDlg->SendMessage(WM_INITDIALOG); 
} 
 
void CDrawView::OnGraphRedraw()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	pDoc->UpdateAllViews(this);//使文档对象的所有视图重画 
	Invalidate(); 
	 
} 
 
void CDrawView::OnGraphZoom()  
{ 
	// TODO: Add your command handler code here 
	m_DrawCurrent=11;//标识进行图形放大操作 
    PushNumb=0; 
	 
} 
 
void CDrawView::OnGraphPan()  
{ 
	// TODO: Add your command handler code here 
	m_DrawCurrent=12;//标识进行图形摆动操作 
	PushNumb=0; 
	 
} 
 
void CDrawView::OnGraphUp()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=(CDrawDoc*)GetDocument(); 
	if(pDoc->m_CurrentScreen>0) 
		pDoc->m_CurrentScreen--; 
	m_xStart=p_Screen[pDoc->m_CurrentScreen].sx; 
	m_yStart=p_Screen[pDoc->m_CurrentScreen].sy; 
	blc=p_Screen[pDoc->m_CurrentScreen].blc; 
	Invalidate();    //重画图形 
 
	 
} 
 
void CDrawView::OnGraphFirst() //重画首屏 
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	if(pDoc->m_CurrentScreen==0) 
		return ; 
	m_xStart=p_Screen[0].sx; 
	m_yStart=p_Screen[0].sy; 
	blc=p_Screen[0].blc; 
	pDoc->AddScreen(m_xStart,m_yStart,blc); 
	Invalidate(); 
 
	 
} 
 
//实现显示全屏功能 
void CDrawView::OnGraphAll()  
{ 
	// TODO: Add your command handler code here 
	float minx,miny,maxx,maxy,bl1; 
	CDrawDoc* pDoc=GetDocument(); 
	SetCapture(); 
	SetCursor(LoadCursor(NULL,IDC_WAIT)); 
	BOOL pb=pDoc->GetRect(&minx,&miny,&maxx,&maxy); 
	SetCursor(LoadCursor(NULL,IDC_ARROW)); 
	ReleaseCapture(); 
	if(!pb) 
		return ; 
	bl1=(maxx-minx)/(m_wScreen-20); 
	blc=(maxy-miny)/(m_hScreen-20); 
	if(bl1>blc) 
		blc=bl1; 
	m_xStart=minx-10*blc; 
	m_yStart=miny-10*blc; 
	p_Screen[0].sx=m_xStart; 
	p_Screen[0].sy=m_yStart; 
	p_Screen[0].blc=blc; 
	pDoc->m_CurrentScreen=0; 
	Invalidate(); 
 
	 
} 
 
void CDrawView::OnSelectMouse()  
{ 
	// TODO: Add your command handler code here 
    m_DrawCurrent=30;   //标识进行图形元素点选操作  
	PushNumb=0; 
	 
} 
 
void CDrawView::OnSelectClear()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	CClientDC ht(this); 
	for(int i=0;in_GraphSelect;i++) 
		pDoc->DrawGraph(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index,0,0,0); 
	pDoc->n_GraphSelect=0; 
	 
} 
 
 
void CDrawView::OnEditMove()  
{ 
	// TODO: Add your command handler code here 
	CDrawDoc* pDoc=GetDocument(); 
	m_DrawCurrent=19; 
	PushNumb=0; 
	 
} 
void CDrawView::Delete(CDC* pDC,int Lb,int index) 
{ 
	float x1,y1,x2,y2; 
	CDrawDoc* pDoc=GetDocument(); 
	CDraw* pDraw; 
	pDraw=pDoc->GetGraph(Lb,index); 
	pDraw->Delete(1); 
	if(Lb==1) 
		pDraw->Draw(pDC,0,2,m_bColor); 
	else if(Lb==2) 
		pDraw->Draw(pDC,0,2,m_bColor); 
	else if(Lb==3) 
	{ 
		if(!pDraw->IsFill()) 
			pDraw->Draw(pDC,0,2,m_bColor); 
		else 
		{ 
			pDraw->GetRect(&x1,&y1,&x2,&y2); 
			ReDrawRect(x1,y1,x2,y2); 
		} 
	} 
	else if(Lb==4) 
		pDraw->Draw(pDC,0,2,m_bColor); 
	else if(Lb==5) 
	{ 
		pDraw->GetRect(&x1,&y1,&x2,&y2); 
		ReDrawRect(x1,y1,x2,y2); 
	} 
	else if(Lb==6) 
	{ 
		pDraw->GetRect(&x1,&y1,&x2,&y2); 
		ReDrawRect(x1,y1,x2,y2); 
	} 
	else if(Lb==7) 
	{ 
		pDraw->GetRect(&x1,&y1,&x2,&y2); 
		ReDrawRect(x1,y1,x2,y2); 
	} 
	else if(Lb==8) 
		pDraw->Draw(pDC,0,2,m_bColor); 
 
} 
 
void CDrawView::ReDrawRect(float X1,float Y1,float X2,float Y2) 
{ 
	float xx1,xx2,yy1,yy2; 
	CRect r1; 
	//以下是视图屏幕矩形区域的实际坐标 
	xx1=xMinScreen; 
	xx2=xMaxScreen; 
	yy1=yMinScreen; 
	yy2=yMaxScreen; 
	//得到需要绘制区域与视图屏幕区域相交的边界矩形 
	BOOL IsCross=RectCross(&xx1,&yy1,&xx2,&yy2,X1,Y1,X2,Y2); 
	if(IsCross) 
	{ 
		r1.left=(int)((xx1-m_xStart)/blc)-1; 
		r1.right=(int)((xx2-m_xStart)/blc)+1; 
		r1.top=m_hScreen-(int)((yy2-m_yStart)/blc)-1; 
		r1.bottom=m_hScreen-(int)((yy1-m_yStart)/blc)+1; 
		InvalidateRect(r1); 
 
	} 
} 
 
BOOL CDrawView::RectCross(float* x1,float* y1,float* x2,float* y2,float xx1,float yy1,float xx2,float yy2) 
{ 
	float m_X1,m_Y1,m_X2,m_Y2; 
	m_X1=*x1;m_Y1=*y1;m_X2=*x2;m_Y2=*y2; 
	if(m_X1>xx2||m_X2yy2||m_Y2n_GraphSelect;i++) 
	{ 
		Delete(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].index); 
		ReleaseCapture(); 
		pDoc->n_GraphSelect=0; 
	} 
}