www.pudn.com > 44757463.rar > GraphSoftView.cpp
// GraphSoftView.cpp : implementation of the CGraphSoftView class // #include "stdafx.h" #include "stdAfx.h" #include "GraphSoft.h" #include "GraphDefines.h" #include "GraphSoftDoc.h" #include "GraphSoftView.h" #include "FullViewBtn.h" #include "GraphInfoDlg.h" #include "FullScreenHandler.h" #include "ColorSetDlg.h" #include "GlobalFunction.h" #include "MainFrm.h" #include "UND_Create.h" #include "UND_Move.h" #include "UND_Rotate.h" #include "UND_Magnify.h" #include "UND_ShowPoints.h" #include "UND_TopToBtm.h" #include "UND_LeftToRight.h" #include "UND_Delete.h" #include "UND_Copy.h" #include "UND_Edit.h" #include "UND_Property.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGraphSoftView IMPLEMENT_DYNCREATE(CGraphSoftView, CScrollView) BEGIN_MESSAGE_MAP(CGraphSoftView, CScrollView) //{{AFX_MSG_MAP(CGraphSoftView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_COMMAND(ID_DRAW_DDALINE, OnDrawDdaline) ON_COMMAND(ID_FILE_EXPORT, OnFileExport) ON_WM_CONTEXTMENU() ON_COMMAND(ID_GRAPH_MOVE, OnGraphMove) ON_WM_LBUTTONDBLCLK() ON_UPDATE_COMMAND_UI(ID_DRAW_DDALINE, OnUpdateDrawDdaline) ON_COMMAND(ID_DRAW_RECTANGLE, OnDrawRectangle) ON_COMMAND(ID_DRAW_ROUNDRECT, OnDrawRoundrect) ON_COMMAND(ID_DRAW_POLYGON, OnDrawPolygon) ON_UPDATE_COMMAND_UI(ID_DRAW_POLYGON, OnUpdateDrawPolygon) ON_UPDATE_COMMAND_UI(ID_DRAW_RECTANGLE, OnUpdateDrawRectangle) ON_UPDATE_COMMAND_UI(ID_DRAW_ROUNDRECT, OnUpdateDrawRoundrect) ON_COMMAND(ID_DRAW_ELLIPSE, OnDrawEllipse) ON_UPDATE_COMMAND_UI(ID_DRAW_ELLIPSE, OnUpdateDrawEllipse) ON_COMMAND(ID_DRAW_CIRCLE, OnDrawCircle) ON_UPDATE_COMMAND_UI(ID_DRAW_CIRCLE, OnUpdateDrawCircle) ON_COMMAND(ID_DRAW_NONE, OnDrawNone) ON_UPDATE_COMMAND_UI(ID_DRAW_NONE, OnUpdateDrawNone) ON_COMMAND(ID_GRAPH_MAGNIFY, OnGraphMagnify) ON_COMMAND(ID_GRAPH_ROTATE, OnGraphRotate) ON_COMMAND(ID_GRAPH_PROPERTIY, OnGraphPropertiy) ON_COMMAND(ID_GRAPH_DELETE, OnGraphDelete) ON_COMMAND(ID_GRAPH_COPY, OnGraphCopy) ON_WM_DESTROY() ON_COMMAND(ID_SELECT_ALL, OnSelectAll) ON_UPDATE_COMMAND_UI(ID_SELECT_ALL, OnUpdateSelectAll) ON_COMMAND(ID_OPERATION_OVER, OnOperationOver) ON_UPDATE_COMMAND_UI(ID_GRAPH_DELETE, OnUpdateGraphDelete) ON_COMMAND(ID_SELECT_PENWIDTH, OnSelectPenwidth) ON_UPDATE_COMMAND_UI(ID_SELECT_PENWIDTH, OnUpdateSelectPenwidth) ON_WM_SETCURSOR() ON_COMMAND(ID_DRAW_PARALLELOGRAM, OnDrawParallelogram) ON_UPDATE_COMMAND_UI(ID_DRAW_PARALLELOGRAM, OnUpdateDrawParallelogram) ON_COMMAND(ID_GRAPH_ROTATECENTER_SET, OnGraphRotatecenterSet) ON_COMMAND(ID_GRAPH_ROTATE_LEFT, OnGraphRotateLeft) ON_COMMAND(ID_GRAPH_ROTATE_RIGHT, OnGraphRotateRight) ON_UPDATE_COMMAND_UI(ID_GRAPH_ROTATECENTER_SET, OnUpdateGraphRotatecenterSet) ON_COMMAND(ID_INPUT_CONFIRM, OnInputConfirm) ON_COMMAND(ID_SHAPE_OVER, OnShapeOver) ON_COMMAND(ID_DRAW_MODELCURVE2AVB, OnDrawModelcurve2avb) ON_UPDATE_COMMAND_UI(ID_DRAW_MODELCURVE2AVB, OnUpdateDrawModelcurve2avb) ON_COMMAND(ID_DRAW_MODELCURVE3PARAM, OnDrawModelcurve3param) ON_UPDATE_COMMAND_UI(ID_DRAW_MODELCURVE3PARAM, OnUpdateDrawModelcurve3param) ON_UPDATE_COMMAND_UI(ID_GRAPH_COPY, OnUpdateGraphCopy) ON_UPDATE_COMMAND_UI(ID_GRAPH_MAGNIFY, OnUpdateGraphMagnify) ON_UPDATE_COMMAND_UI(ID_GRAPH_MOVE, OnUpdateGraphMove) ON_UPDATE_COMMAND_UI(ID_GRAPH_PROPERTIY, OnUpdateGraphPropertiy) ON_UPDATE_COMMAND_UI(ID_GRAPH_ROTATE, OnUpdateGraphRotate) ON_COMMAND(ID_DRAW_BEZIERCURVE, OnDrawBeziercurve) ON_UPDATE_COMMAND_UI(ID_DRAW_BEZIERCURVE, OnUpdateDrawBeziercurve) ON_UPDATE_COMMAND_UI(ID_INPUT_CONFIRM, OnUpdateInputConfirm) ON_COMMAND(ID_SELECT_FILL_COLOR, OnSelectFillColor) ON_COMMAND(ID_GRAPH_EDIT, OnGraphEdit) ON_COMMAND(ID_GRAPH_POINTSHIDE, OnGraphPointshide) ON_COMMAND(ID_GRAPH_POINTSSHOW, OnGraphPointsshow) ON_COMMAND(ID_GRAPH_LEFTTORIGHT, OnGraphLefttoright) ON_COMMAND(ID_GRAPH_TOPTOBOTTOM, OnGraphToptobottom) ON_UPDATE_COMMAND_UI(ID_GRAPH_TOPTOBOTTOM, OnUpdateGraphToptobottom) ON_UPDATE_COMMAND_UI(ID_GRAPH_EDIT, OnUpdateGraphEdit) ON_UPDATE_COMMAND_UI(ID_GRAPH_LEFTTORIGHT, OnUpdateGraphLefttoright) ON_UPDATE_COMMAND_UI(ID_GRAPH_POINTSHIDE, OnUpdateGraphPointshide) ON_UPDATE_COMMAND_UI(ID_GRAPH_POINTSSHOW, OnUpdateGraphPointsshow) ON_UPDATE_COMMAND_UI(ID_OPERATION_OVER, OnUpdateOperationOver) ON_WM_INITMENUPOPUP() ON_WM_CREATE() ON_UPDATE_COMMAND_UI(ID_GRAPH_ROTATE_LEFT, OnUpdateGraphRotateLeft) ON_UPDATE_COMMAND_UI(ID_GRAPH_ROTATE_RIGHT, OnUpdateGraphRotateRight) ON_WM_ERASEBKGND() ON_MESSAGE(WM_SELGRAPH_POINT,OnSelGraphPoint) ON_MESSAGE(WM_SELGRAPH_ROTATE,OnSelGraphRotate) ON_MESSAGE(WM_SELGRAPH_COLOR,OnSelGraphColor) ON_MESSAGE(WM_SELGRAPH_FILLCOLOR,OnSelGraphFillClr) ON_MESSAGE(WM_SELGRAPH_FILLSTYLE,OnSelGraphFillSty) ON_MESSAGE(WM_SELGRAPH_PENWIDTH,OnSelGraphPenWidth) ON_WM_HSCROLL() ON_WM_VSCROLL() ON_COMMAND(ID_HELPFILE, OnHelpfile) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGraphSoftView construction/destruction CGraphSoftView::CGraphSoftView() { // TODO: add construction code here m_nMouseFlag=0; m_bDrawFlag=FALSE; //m_mouseStatePrev=_MOUSE_NONESTATE; m_nCurrentPenWidth=1; m_clrCurrentColor=RGB(0,0,0); m_clrCurrentFill=RGB(255,255,255); m_clrBkColor=RGB(255,255,255); m_clrDefaultColor=RGB(0,0,0); m_flPrevX=m_flPrevY=0; m_flStartX=m_flStartY=0; m_graph_op=_graph_noneOp; m_bGraphOp=FALSE; m_bCanSelectGraphType=TRUE; m_ptSelectGraphCenter=CPoint(0,0); m_flRotCenterX=m_flRotCenterY=0; m_bSelectRotateCenter=FALSE; m_rectSelectGraph=CRect(0,0,0,0); m_rectMaxWindow=CRect(0,0,800,650); m_rectTarget=m_rectMaxWindow; m_pCurrentShape=NULL; m_shapeCurFillStyle=_shape_none_fill; m_flRate = 1; m_unPrevCur=0; } CGraphSoftView::~CGraphSoftView() { } BOOL CGraphSoftView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CScrollView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CGraphSoftView drawing void CGraphSoftView::OnDraw(CDC* pDC) { CGraphSoftDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here POSITION pos; pos=pDoc->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=pDoc->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ //pShape->DrawCutToRect(pDC,RGB(255,0,0),RGB(255,0,0),m_rectTarget,m_rectMaxWindow); pShape->DrawCutToRect(pDC,m_rectTarget,m_rectMaxWindow); }else{ pShape->DrawCutToRect(pDC,m_rectTarget,m_rectMaxWindow); } } CClientDC dc(this); CBrush brush,*pOldBr; brush.CreateSolidBrush(RGB(255,0,0)); pOldBr = dc.SelectObject(&brush); SelectObject(dc.GetSafeHdc(),&brush); dc.SelectObject(pOldBr); pDC->TextOut(0,0,FullScreenHandler.InFullScreenMode() ?_T("恢复窗口按 Ctrl-U ") : _T("")); } //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // MODULE :Redraw // ABSTRACT :重绘所给矩形区域内的图形 // FUNCTION : // NOTE : // RETURN : // ARGUMENTS: // I/O TYPE NAME EXPLANATION // I CRect* pRect 所画矩形对应的逻辑坐标矩形 // CREATE : FNST)handwolf 2004-4-20 // UPDATE : // : ////////////////////////////////////////////////////////////////////// void CGraphSoftView::Redraw(CDC* pDC,CRect* const pRect,bool bDrawRect,COLORREF color) { CRect rect,rect2; POSITION pos; pRect->NormalizeRect(); rect=*pRect; rect2.left=rect.left-m_nCurrentPenWidth-1; rect2.right=rect.right+m_nCurrentPenWidth+1; rect2.top=rect.top-m_nCurrentPenWidth+1; rect2.bottom=rect.bottom+m_nCurrentPenWidth+1; float left=rect.left; float top=rect.top; float right=rect.right; float bottom=rect.bottom; Lp2Dp(left,top); Lp2Dp(right,bottom); rect=CRect(left,top,right,bottom); if(bDrawRect==TRUE&&color==RGB(255,255,255)) { CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, color); poldPen=pDC->SelectObject(&pen); pDC->MoveTo(rect.TopLeft()); pDC->LineTo(rect.left,rect.bottom); pDC->LineTo(rect.right,rect.bottom); pDC->LineTo(rect.right,rect.top); pDC->LineTo(rect.TopLeft()); pDC->SelectObject(poldPen); } pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsInRect(rect2)){ pShape->DrawCutToRect(pDC,m_rectTarget,m_rectMaxWindow); } } if(bDrawRect==TRUE&&color!=RGB(255,255,255)) { CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, color); poldPen=pDC->SelectObject(&pen); pDC->MoveTo(rect.TopLeft()); pDC->LineTo(rect.left,rect.bottom); pDC->LineTo(rect.right,rect.bottom); pDC->LineTo(rect.right,rect.top); pDC->LineTo(rect.TopLeft()); pDC->SelectObject(poldPen); } } // CGraphSoftView printing BOOL CGraphSoftView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CGraphSoftView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CGraphSoftView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CGraphSoftView diagnostics #ifdef _DEBUG void CGraphSoftView::AssertValid() const { CScrollView::AssertValid(); } void CGraphSoftView::Dump(CDumpContext& dc) const { CScrollView::Dump(dc); } CGraphSoftDoc* CGraphSoftView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphSoftDoc))); return (CGraphSoftDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CGraphSoftView message handlers void CGraphSoftView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); float flX=point.x; float flY=point.y; Dp2Lp(flX,flY); m_nMouseFlag=1; m_flPrevX=flX; m_flPrevY=flY; m_flStartX=flX; m_flStartY=flY; CUND_Base* pUndo; if(m_bGraphOp){ m_bDrawFlag=FALSE; }else{ m_bDrawFlag=TRUE; switch(GetDocument()->m_nCurrentShapeType) { case _shape_none: break; case _shape_Line: m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CLine(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); break; case _shape_Parallelogram: { if(m_flArrayX.GetSize()==0){ m_flArrayX.Add(flX); m_flArrayY.Add(flY); }else if(m_flArrayX.GetSize()==1) { m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CParallelogram(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); int old_rop = dc.SetROP2(R2_XORPEN); // m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); float x1=m_flArrayX.GetAt(0); float y1=m_flArrayY.GetAt(0); float x2=m_flArrayX.GetAt(1); float y2=m_flArrayY.GetAt(1); Lp2Dp(x1,y1);//转回屏幕坐标,易于画图 Lp2Dp(x2,y2); DrawLine(&dc,x1,y1,x2,y2,RGB(0,255,0),m_nCurrentPenWidth+1); dc.SetROP2(old_rop); } } break; case _shape_Rectangle: m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CRectangle(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); break; case _shape_RoundRect: m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CRoundRect(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); break; case _shape_Circle: m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CCircle(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); break; case _shape_Ellipse: m_flArrayX.Add(flX); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_flArrayY.Add(flY); m_pCurrentShape=new CEllipse(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); break; case _shape_Polygon: if(m_flArrayX.GetSize()==0){ m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_pCurrentShape=new CPolygon(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); } break; case _shape_ModelCurve3Param: if(m_flArrayX.GetSize()==0){ m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_pCurrentShape=new CModelCurve3Param(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); } break; case _shape_ModelCurve2AvB: if(m_flArrayX.GetSize()==0){ m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_pCurrentShape=new CModelCurve2AvB(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); } break; case _shape_BezierCurve: if(m_flArrayX.GetSize()==0){ m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_pCurrentShape=new CBezierCurve(); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); pUndo = new CUND_Create(m_pCurrentShape); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->m_shapeList.AddTail(m_pCurrentShape); int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); } break; default: break; } } CRect rect;//矩形 GetClientRect(&rect); ClientToScreen(&rect); ClipCursor(&rect); CScrollView::OnLButtonDown(nFlags, point); } void CGraphSoftView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); float flX=point.x; float flY=point.y; Dp2Lp(flX,flY); CRect rect; m_nMouseFlag=0; if(m_bGraphOp==FALSE&&m_bDrawFlag) { switch(GetDocument()->m_nCurrentShapeType) { case _shape_none: { int old_rop = dc.SetROP2(R2_XORPEN); dc.SetBkMode(TRANSPARENT); CPen pen,*poldPen; CBrush brush,*pOldbr; pen.CreatePen(PS_SOLID,1, RGB(0,200,0)); poldPen=dc.SelectObject(&pen); brush.CreateSolidBrush(RGB(50,0,0)); //brush.CreateSysColorBrush(2); pOldbr=dc.SelectObject(&brush); float x1,y1,x2,y2; x1=m_flStartX; y1=m_flStartY; x2=m_flPrevX; y2=m_flPrevY; Lp2Dp(x1,y1);//转回屏幕坐标,易于画图 Lp2Dp(x2,y2); CRect rt(x1,y1,x2,y2); rt.NormalizeRect(); dc.Rectangle(&rt); dc.SelectObject(poldPen); dc.SelectObject(pOldbr); dc.SetROP2(old_rop); // Redraw(&dc,&rect,FALSE); rt=CRect(m_flStartX,m_flStartY,m_flPrevX,m_flPrevY);//用逻辑坐标,利于操作 GetDocument()->SelectInRect(&rt,&dc,nFlags,TRUE); // SetDrawMenuEnable(!GetDocument()->HasGraphSelected());//协调一直 m_bDrawFlag=FALSE; break; } case _shape_Line: case _shape_Rectangle: case _shape_RoundRect: case _shape_Circle: case _shape_Ellipse: { int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); // m_pCurrentShape->Draw(&dc,RGB(0,255,0),m_nCurrentPenWidth+1); dc.SetROP2(old_rop); m_pCurrentShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); // m_pCurrentShape->Draw(&dc); } m_bDrawFlag=FALSE; break; case _shape_Parallelogram: { int nTemp=m_flArrayX.GetSize(); if(nTemp==3){ int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); m_flArrayX.SetAt(2,flX); m_flArrayY.SetAt(2,flY); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); dc.SetROP2(old_rop); m_pCurrentShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); m_bDrawFlag=FALSE; } } break; case _shape_Polygon: case _shape_ModelCurve3Param: case _shape_ModelCurve2AvB: case _shape_BezierCurve: { int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); m_flArrayX.SetAt(m_flArrayX.GetSize()-1,flX); m_flArrayY.SetAt(m_flArrayY.GetSize()-1,flY); m_flArrayX.Add(flX); m_flArrayY.Add(flY); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); } break; default: m_bDrawFlag=FALSE; break; } // } if(m_bGraphOp){ float flxTemp,flyTemp; if(m_bSelectRotateCenter){ int old_rop = dc.SetROP2(R2_XORPEN); float flxTemp,flyTemp; flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); m_bSelectRotateCenter=FALSE; m_flRotCenterX=flX;//逻辑坐标点 m_flRotCenterY=flY; flxTemp=m_flRotCenterX; flyTemp=m_flRotCenterY; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); dc.SetROP2(old_rop); }else{ CUND_Base* pUndo; switch(m_graph_op) { case _graph_magnify: { int old_rop = dc.SetROP2(R2_XORPEN); flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); poldPen=dc.SelectObject(&pen); float flLx,flRx,flTy,flBy; flLx=m_rectSelectGraph.left/1000.0; flTy=m_rectSelectGraph.top/1000.0; flRx=m_rectSelectGraph.right/1000.0; flBy=m_rectSelectGraph.bottom/1000.0; Lp2Dp(flLx,flTy); Lp2Dp(flRx,flBy); dc.MoveTo(flLx,flTy); dc.LineTo(flLx,flBy); dc.LineTo(flRx,flBy); dc.LineTo(flRx,flTy); dc.LineTo(flLx,flTy); dc.SelectObject(poldPen); dc.SetROP2(old_rop); GetDocument()->RefreshSelectGraph(); SUNDMagnify *pStructMagnify=new SUNDMagnify(); GetDocument()->GetSelGraphIDArray(pStructMagnify->ArrId); float flDisA,flDisB; flDisA=GetDistance(m_ptSelectGraphCenter.x/1000.0,m_ptSelectGraphCenter.y/1000.0,m_flStartX,m_flStartY);//attention: m_ptStart flDisB=GetDistance(m_ptSelectGraphCenter.x/1000.0,m_ptSelectGraphCenter.y/1000.0,m_flPrevX,m_flPrevY); if(flDisA<0.5){ flDisA=0.5; } pStructMagnify->flScale=flDisB/flDisA; pStructMagnify->flCX=m_ptSelectGraphCenter.x/1000.0; pStructMagnify->flCY=m_ptSelectGraphCenter.y/1000.0; pUndo = new CUND_Magnify(pStructMagnify); GetDocument()->m_pCore->AddUndoItem(pUndo); break; } case _graph_rotate: { int old_rop = dc.SetROP2(R2_XORPEN); flxTemp=m_flRotCenterX; flyTemp=m_flRotCenterY; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); TRACE("OnLButtonUp()---Logical RotateCenter(%f,%f)\n",m_flRotCenterX,m_flRotCenterY); TRACE("OnLButtonUp()---Device RotateCenter(%f,%f)\n",flxTemp,flyTemp); m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; // Redraw(&dc,&m_rectSelectGraph,TRUE,RGB(255,255,255)); dc.SetROP2(old_rop); GetDocument()->RefreshSelectGraph(); SUNDRotate *pStructRotate=new SUNDRotate(); GetDocument()->GetSelGraphIDArray(pStructRotate->ArrId); pStructRotate->flAngle= GetAngleFromPoints(m_flRotCenterX,m_flRotCenterY, m_flStartX,m_flStartY,m_flPrevX,m_flPrevY); pStructRotate->flCX=m_flRotCenterX; pStructRotate->flCY=m_flRotCenterY; pUndo = new CUND_Rotate(pStructRotate); GetDocument()->m_pCore->AddUndoItem(pUndo); break; } case _graph_edit: // Redraw(&dc,&m_rectSelectGraph,TRUE,RGB(255,255,255)); GetDocument()->RefreshSelectGraph(); break; case _graph_move: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; SUNDMove *pStructMove=new SUNDMove(); GetDocument()->GetSelGraphIDArray(pStructMove->ArrId); pStructMove->nStepX=m_flPrevX-m_flStartX; pStructMove->nStepY=m_flPrevY-m_flStartY; pUndo = new CUND_Move(pStructMove); GetDocument()->m_pCore->AddUndoItem(pUndo); break; } case _graph_property: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_delete: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_leftToRight: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_topTobottom: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_pointsShow: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_pointsHide: { m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_copy: // Redraw(&dc,&m_rectSelectGraph,TRUE,RGB(255,255,255)); { SUNDCopy *pStructCopy=new SUNDCopy(); GetDocument()->GetSelGraphArray(pStructCopy->ArrShape); CUND_Base* pUndo = new CUND_Copy(pStructCopy); GetDocument()->m_pCore->AddUndoItem(pUndo); SendMessage(WM_COMMAND,WPARAM(ID_GRAPH_COPY)); break; } default: break; } } } if(!m_bDrawFlag){ //如果不画了,删除缓存的点。 m_flArrayX.RemoveAll(); m_flArrayY.RemoveAll(); m_pCurrentShape=NULL; ClipCursor(NULL); } CScrollView::OnLButtonUp(nFlags, point); } void CGraphSoftView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); float flX=point.x; float flY=point.y; Dp2Lp(flX,flY); CRect rect; if(m_bDrawFlag) { switch(GetDocument()->m_nCurrentShapeType) { case _shape_none: { int old_rop = dc.SetROP2(R2_XORPEN); CPen pen,*poldPen; CBrush brush,*pOldbr; pen.CreatePen(PS_SOLID,1, RGB(0,200,0)); poldPen=dc.SelectObject(&pen); brush.CreateSolidBrush(RGB(50,0,0)); pOldbr=dc.SelectObject(&brush); dc.SetBkMode(TRANSPARENT); float x1,y1,x2,y2; x1=m_flStartX; y1=m_flStartY; x2=m_flPrevX; y2=m_flPrevY; Lp2Dp(x1,y1);//转回屏幕坐标,易于画图 Lp2Dp(x2,y2); CRect rt(x1,y1,x2,y2); rt.NormalizeRect(); x2=flX; y2=flY; Lp2Dp(x2,y2); CRect rectTmp(x1,y1,x2,y2); //if(rect.left rectTmp.right||rect.top rectTmp.bottom){ dc.Rectangle(&rt); dc.Rectangle(&rectTmp); // Redraw(&dc,&rectTmp,FALSE); dc.SelectObject(poldPen); dc.SelectObject(pOldbr); dc.SetROP2(old_rop); break; } case _shape_Line: case _shape_Rectangle: case _shape_RoundRect: case _shape_Circle: case _shape_Ellipse: case _shape_Polygon: case _shape_ModelCurve3Param: case _shape_ModelCurve2AvB: case _shape_BezierCurve: { //m_pCurrentShape=GetDocument()->m_shapeList.GetTail(); if(m_flArrayX.GetSize()>0){ int old_rop = dc.SetROP2(R2_XORPEN); rect=m_pCurrentShape->GetBoundaryRect(); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); // m_pCurrentShape->Draw(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1); m_flArrayX.SetAt(m_flArrayX.GetSize()-1,flX); m_flArrayY.SetAt(m_flArrayY.GetSize()-1,flY); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); // m_pCurrentShape->Draw(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1); dc.SetROP2(old_rop); } break; } case _shape_Parallelogram: { if(m_flArrayX.GetSize()>0&&m_flArrayX.GetSize()<=2){ int old_rop = dc.SetROP2(R2_XORPEN); //rect=GetRectFromPoint(m_ptStart,m_ptPrev); float x1=m_flStartX; float y1=m_flStartY; float x2=m_flPrevX; float y2=m_flPrevY; Lp2Dp(x1,y1);//转回屏幕坐标,易于画图 Lp2Dp(x2,y2); DrawLine(&dc,x1,y1,x2,y2,RGB(0,255,0),m_nCurrentPenWidth+1); // Redraw(&dc,&rect); x2=flX; y2=flY; Lp2Dp(x2,y2); DrawLine(&dc,x1,y1,x2,y2,RGB(0,255,0),m_nCurrentPenWidth+1); dc.SetROP2(old_rop); } else if(m_flArrayX.GetSize()==3){ int old_rop = dc.SetROP2(R2_XORPEN); // rect=m_pCurrentShape->GetBoundaryRect(); // Redraw(&dc,&rect,FALSE); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); m_flArrayX.SetAt(2,flX); m_flArrayY.SetAt(2,flY); m_pCurrentShape->CreatGraph(m_flArrayX,m_flArrayY,m_nCurrentPenWidth,m_clrCurrentColor,m_clrCurrentFill,m_shapeCurFillStyle); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); } } break; default: break; }//switch{case:} }//if if(m_bGraphOp&&(nFlags&MK_LBUTTON)&&!m_bSelectRotateCenter){ GraphOperator(&dc,m_graph_op,m_flPrevX,m_flPrevY,flX,flY); }else if(m_bGraphOp&&m_graph_op==_graph_copy){//copy 例外 GraphOperator(&dc,m_graph_op,m_flPrevX,m_flPrevY,flX,flY); }else if(m_bGraphOp&&m_graph_op==_graph_edit){ GetDocument()->SetEditStateCursor(flX,flY,((float)m_rectTarget.Width())/m_rectMaxWindow.Width()); } m_flPrevX=flX; m_flPrevY=flY; CString strTemp; strTemp.Format("屏幕:(%d,%d) 逻辑:(%d,%d)",point.x,point.y,(int)flX,(int)flY); //TRACE("%s\n",strTemp); ((CMainFrame*)(AfxGetApp()->GetMainWnd()))->SetPaneText(1,LPCSTR(strTemp),TRUE); // CScrollView::OnMouseMove(nFlags, point); } //////////////////////////////////////////////////////////////// //function GraphOperator(...) //param //opId-----the ID if Graph Operation that should be execute //nstepx---the step in x direction //nstepy---the step in y direction //point----the present point of mouse /////////////////////////////////////////////////////////////// void CGraphSoftView::GraphOperator(CDC *pDC,GRAPH_OPERATION opId,float PrevX,float PrevY,float CurX,float CurY) { CPoint ptPrev(PrevX,PrevY); CPoint ptPresent(CurX,CurY); POSITION pos; CRect rect=GetSelectGraphBoundaryRect(); CPoint ptCenter=rect.CenterPoint(); float flAngle; float flScale=1; CPoint ptStart(m_flStartX,m_flStartY); //Get the angle that should rotate //先求出两点(前点与移动后点)向中心点的连线与水平线的交角 //然后减一下即可得到转过的角度 int old_rop = pDC->SetROP2(R2_XORPEN); pDC->SetBkMode(TRANSPARENT); switch(opId){ case _graph_magnify: { float flDisA,flDisB; flDisA=GetDistance(m_ptSelectGraphCenter.x/1000.0,m_ptSelectGraphCenter.y/1000.0,m_flStartX,m_flStartY);//attention: m_ptStart flDisB=GetDistance(m_ptSelectGraphCenter.x/1000.0,m_ptSelectGraphCenter.y/1000.0,CurX,CurY); if(flDisA<0.5){ flDisA=0.5; } flScale=flDisB/flDisA; //Redraw(pDC,&rect,TRUE,RGB(255,255,255)); CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); poldPen=pDC->SelectObject(&pen); float flLx,flRx,flTy,flBy; flLx=rect.left/1000.0; flTy=rect.top/1000.0; flRx=rect.right/1000.0; flBy=rect.bottom/1000.0; Lp2Dp(flLx,flTy); Lp2Dp(flRx,flBy); pDC->MoveTo(flLx,flTy); pDC->LineTo(flLx,flBy); pDC->LineTo(flRx,flBy); pDC->LineTo(flRx,flTy); pDC->LineTo(flLx,flTy); float flxTemp,flyTemp; flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(pDC,flxTemp,flyTemp,RGB(0,255,0)); pDC->SelectObject(poldPen); //TRACE("SCALE:%f\n",flScale); break; } case _graph_rotate: { if(ptPresent==ptPrev) return; //Redraw(pDC,&rect,FALSE); float flx,fly; flx=m_flRotCenterX; fly=m_flRotCenterY; Lp2Dp(flx,fly); DrawOutRectPoint(pDC,flx,fly,RGB(0,255,0)); TRACE("GraphOperator()---Logical RotateCenter(%f,%f)\n",m_flRotCenterX,m_flRotCenterY); TRACE("GraphOperator()---Device RotateCenter(%f,%f)\n",flx,fly); flAngle=GetAngleFromPoints(m_flRotCenterX,m_flRotCenterY,m_flStartX,m_flStartY,CurX,CurY); //TRACE("ANGLE:-%f,Cos----%f,Sin-----%f\n",flAngle,cos(flAngle),sin(flAngle)); break; } default: break; }//end switch //////////// pDC->SetROP2(old_rop); pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ pShape->DrawCutToRect(pDC,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); switch(opId) { case _graph_move: { pShape->Move(pDC,CurX-PrevX,CurY-PrevY); break; } case _graph_rotate: { pShape->Rotate(pDC,m_flRotCenterX,m_flRotCenterY,flAngle); break; } case _graph_magnify: { pShape->Magnify(pDC,m_ptSelectGraphCenter.x/1000.0,m_ptSelectGraphCenter.y/1000.0,flScale); break; } case _graph_property: case _graph_delete: break; case _graph_copy: pShape->Move(pDC,CurX-PrevX,CurY-PrevY); break; case _graph_edit: pShape->PartMove(pDC,m_flPrevX,m_flPrevY,CurX,CurY); SetCursor(AfxGetApp()->LoadCursor(m_unPrevCur)); break; default: break; } } pShape->DrawCutToRect(pDC,m_rectTarget,m_rectMaxWindow); } pDC->SetROP2(R2_XORPEN); switch(opId){ case _graph_move: //rect=GetSelectGraphBoundaryRect(); //Redraw(pDC,&rect,FALSE); break; case _graph_copy: // Redraw(pDC,&rect,FALSE); // rect=GetSelectGraphBoundaryRect(); //Redraw(pDC,&rect,FALSE); break; case _graph_rotate: { //rect=GetSelectGraphBoundaryRect(); float flx,fly; flx=m_flRotCenterX; fly=m_flRotCenterY; Lp2Dp(flx,fly); TRACE("GraphOperator()---Logical RotateCenter(%f,%f)\n",m_flRotCenterX,m_flRotCenterY); TRACE("GraphOperator()---Device RotateCenter(%f,%f)\n",flx,fly); DrawOutRectPoint(pDC,flx,fly,RGB(0,255,0)); //Redraw(pDC,&rect,FALSE); break; } case _graph_magnify: { rect=GetSelectGraphBoundaryRect(); // Redraw(pDC,&rect,TRUE,RGB(255,255,0)); CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); poldPen=pDC->SelectObject(&pen); float flLx,flRx,flTy,flBy; flLx=m_rectSelectGraph.left/1000.0; flTy=m_rectSelectGraph.top/1000.0; flRx=m_rectSelectGraph.right/1000.0; flBy=m_rectSelectGraph.bottom/1000.0; Lp2Dp(flLx,flTy); Lp2Dp(flRx,flBy); pDC->MoveTo(flLx,flTy); pDC->LineTo(flLx,flBy); pDC->LineTo(flRx,flBy); pDC->LineTo(flRx,flTy); pDC->LineTo(flLx,flTy); float flxTemp,flyTemp; flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(pDC,flxTemp,flyTemp,RGB(0,255,0)); pDC->SelectObject(poldPen); break; } case _graph_edit: // rect=GetSelectGraphBoundaryRect(); // Redraw(pDC,&rect,FALSE); break; default: break; }//end switch } ////////////////////////////////////////////////////// void CGraphSoftView::OnDrawDdaline() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Line) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Line; OnOperationOver() ; } ////////////////////////////////////////////////////// void CGraphSoftView::OnFileExport() { // TODO: Add your command handler code here CClientDC dc(this); // OnPrepareDC(&dc); CDC memDC; CRect rect; GetClientRect(rect); memDC.CreateCompatibleDC(&dc); CBitmap bm; int Width = rect.Width(); int Height = rect.Height(); bm.CreateCompatibleBitmap(&dc, Width, Height); CBitmap* pOld = memDC.SelectObject(&bm); memDC.BitBlt(0, 0, Width, Height, &dc, 0, 0, SRCCOPY); memDC.SelectObject(pOld); BITMAP btm; bm.GetBitmap(&btm); DWORD size = btm.bmWidthBytes * btm.bmHeight; LPSTR lpData = (LPSTR)GlobalAllocPtr(GPTR, size); BITMAPFILEHEADER bfh; ///////////////////////////////////////////// BITMAPINFOHEADER bih; bih.biBitCount = btm.bmBitsPixel; bih.biClrImportant = 0; bih.biClrUsed = 0; bih.biCompression = 0; bih.biHeight = btm.bmHeight; bih.biPlanes = 1; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biSizeImage = size; bih.biWidth = btm.bmWidth; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); //bm.GetBitmapBits(size,lpData);//此函数在处理5-5-5模式的16位色下会出现颜色混乱 bfh.bfReserved1 = bfh.bfReserved2 = 0; bfh.bfType = ((WORD)('M'<< 8)|'B'); bfh.bfSize = 54 + size; bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.lld|*.lld|*.*|*.*|")); if (dlg.DoModal()==IDOK) { if(dlg.GetFileExt()=="bmp"){ CFile bf; CString ss=dlg.GetPathName(); if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite)) { bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER)); bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER)); bf.WriteHuge(lpData, size); bf.Close(); CString str; str.LoadString(IDS_STRING_SAVE_SUCCESS); AfxMessageBox(str); } }else if(dlg.GetFileExt()=="lld"){ FILE *OutStream; OutStream = fopen(dlg.GetPathName(), "w" ); GetDocument()->ExPort(OutStream); fclose(OutStream); } } GlobalFreePtr(lpData); } ////////////////////////////////////////////////// int CGraphSoftView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CScrollView::OnCreate(lpCreateStruct) == -1) return -1; GetDocument()->m_pCore->m_pView=this; // TODO: Add your specialized creation code here return 0; } void CGraphSoftView::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CWnd ::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); // TODO: Add your message handler code here } ////////////////////////////////////////////////////// void CGraphSoftView::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu popup; // CMenu* pPopup; CMenuEx menu; CString str; if(!m_nMouseFlag) { //图形操作 if(GetDocument()->HasGraphSelected()&&m_graph_op==_graph_noneOp) { m_pToolBar=&(((CMainFrame*)(AfxGetApp()->GetMainWnd()))->m_wndTBarGraphOp); menu.CreatePopupMenu(); str.LoadString(ID_GRAPH_MOVE);//移动 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_MOVE,str); str.LoadString(ID_GRAPH_ROTATE);//旋转 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_ROTATE,str); str.LoadString(ID_GRAPH_MAGNIFY);//缩放 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_MAGNIFY,str); str.LoadString(ID_GRAPH_COPY);//拷贝 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_COPY,str); str.LoadString(ID_GRAPH_DELETE);//删除 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_DELETE,str); CMenuEx menuTemp; //显示/隐藏组成点---弹出菜单 menuTemp.CreatePopupMenu(); str.LoadString(ID_GRAPH_POINTSSHOW);//显示组成点 str=str.Left(str.FindOneOf(_T("\n"))); menuTemp.AppendMenu(MF_ENABLED,ID_GRAPH_POINTSSHOW,str); str.LoadString(ID_GRAPH_POINTSHIDE);//隐藏组成点 str=str.Left(str.FindOneOf(_T("\n"))); menuTemp.AppendMenu(MF_ENABLED,ID_GRAPH_POINTSHIDE,str); menuTemp.InitPopupMenu(&menuTemp,IDR_GRAPH_OPERATION,m_pToolBar); str.LoadString(IDS_GRAPH_POINTS); menu.AppendMenu(MF_POPUP,(UINT)(menuTemp.GetSafeHmenu()),str); if(GetDocument()->GetSelectNum()==1){ str.LoadString(ID_GRAPH_EDIT);//编辑 str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_EDIT,str); } str.LoadString(ID_GRAPH_PROPERTIY); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_PROPERTIY,str);//属性 menu.AppendMenu(MF_GRAYED,ID_SEPARATOR); str.LoadString(ID_GRAPHOP_MORE); menu.AppendMenu(MF_ENABLED,ID_GRAPHOP_MORE,str); menu.InitPopupMenu(&menu,IDR_GRAPH_OPERATION,m_pToolBar); UINT nMenuID=menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON|TPM_RETURNCMD , point.x,point.y, this); while(nMenuID==ID_GRAPHOP_MORE||nMenuID==ID_GRAPHOP_LESS){ if(nMenuID==ID_GRAPHOP_MORE){ menu.DeleteMenu(ID_GRAPHOP_MORE,MF_BYCOMMAND); menu.DeleteItem(ID_GRAPHOP_MORE); str.LoadString(ID_GRAPHOP_LESS); menu.AppendMenu(MF_ENABLED,ID_GRAPHOP_LESS,str); str.LoadString(ID_GRAPH_LEFTTORIGHT); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_LEFTTORIGHT,str);//左右变换 str.LoadString(ID_GRAPH_TOPTOBOTTOM); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_TOPTOBOTTOM,str);//上下变换 }else{ menu.DeleteMenu(ID_GRAPHOP_LESS,MF_BYCOMMAND); menu.DeleteItem(ID_GRAPHOP_LESS); menu.DeleteMenu(ID_GRAPH_LEFTTORIGHT,MF_BYCOMMAND); menu.DeleteItem(ID_GRAPH_LEFTTORIGHT); menu.DeleteMenu(ID_GRAPH_TOPTOBOTTOM,MF_BYCOMMAND); menu.DeleteItem(ID_GRAPH_TOPTOBOTTOM); str.LoadString(ID_GRAPHOP_MORE); menu.AppendMenu(MF_ENABLED,ID_GRAPHOP_MORE,str); } menu.m_bInitial=FALSE; menu.ChangeStyle(&menu,m_pToolBar,TRUE); nMenuID=menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON|TPM_RETURNCMD , point.x,point.y, this); ; } this->SendMessage(WM_COMMAND,WPARAM(nMenuID)); menu.DestroyMenu(); menuTemp.DestroyMenu(); } //图形操作子操作 else if(GetDocument()->HasGraphSelected()){ m_pToolBar=&(((CMainFrame*)(AfxGetApp()->GetMainWnd()))->m_wndTBarGraphOp); menu.CreatePopupMenu(); switch(m_graph_op){ case _graph_rotate: str.LoadString(ID_GRAPH_ROTATE_LEFT); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_ROTATE_LEFT,str); str.LoadString(ID_GRAPH_ROTATE_RIGHT); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_GRAPH_ROTATE_RIGHT,str); str.LoadString(ID_GRAPH_ROTATECENTER_SET); str=str.Left(str.FindOneOf(_T("\n"))); if(m_bSelectRotateCenter){ menu.AppendMenu(MF_ENABLED|MF_CHECKED,ID_GRAPH_ROTATECENTER_SET,str); }else{ menu.AppendMenu(MF_ENABLED,ID_GRAPH_ROTATECENTER_SET,str); } menu.AppendMenu(MF_ENABLED,ID_SEPARATOR); break; case _graph_magnify: break; case _graph_copy: break; default: break; } str.LoadString(ID_OPERATION_OVER); str=str.Left(str.FindOneOf(_T("\n"))); menu.AppendMenu(MF_ENABLED,ID_OPERATION_OVER,str); menu.InitPopupMenu(&menu,IDR_GRAPH_OPERATION,m_pToolBar); menu.TrackPopupMenu(TPM_LEFTALIGN ,point.x,point.y,this); menu.DestroyMenu(); } //画图时的操作 else if(GetDocument()->m_nCurrentShapeType!=_shape_none){ CString strMenuTitle; popup.CreatePopupMenu(); switch(GetDocument()->m_nCurrentShapeType){ case _shape_Polygon: if(m_pCurrentShape!=NULL){ strMenuTitle.LoadString(ID_INPUT_CONFIRM); popup.AppendMenu(MF_ENABLED,ID_INPUT_CONFIRM,strMenuTitle); } break; case _shape_ModelCurve3Param: if(m_pCurrentShape!=NULL){ strMenuTitle.LoadString(ID_INPUT_CONFIRM); popup.AppendMenu(MF_ENABLED,ID_INPUT_CONFIRM,strMenuTitle); } break; case _shape_ModelCurve2AvB: if(m_pCurrentShape!=NULL){ strMenuTitle.LoadString(ID_INPUT_CONFIRM); popup.AppendMenu(MF_ENABLED,ID_INPUT_CONFIRM,strMenuTitle); } break; case _shape_BezierCurve: if(m_pCurrentShape!=NULL){ strMenuTitle.LoadString(ID_INPUT_CONFIRM); popup.AppendMenu(MF_ENABLED,ID_INPUT_CONFIRM,strMenuTitle); } break; default: break; } strMenuTitle.LoadString(ID_SHAPE_OVER); strMenuTitle=strMenuTitle.Left(strMenuTitle.FindOneOf(_T("\n"))); popup.AppendMenu(MF_ENABLED,ID_SHAPE_OVER,strMenuTitle); //popup.EnableMenuItem(1,MF_BYPOSITION|MF_GRAYED); popup.TrackPopupMenu(TPM_LEFTALIGN ,point.x,point.y,this); popup.DestroyMenu(); } } } ////////////////////////////////////////////////////// void CGraphSoftView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(GetDocument()->m_nCurrentShapeType!=_shape_none){ SendMessage(WM_COMMAND,WPARAM(ID_INPUT_CONFIRM)); } if(m_graph_op!=_graph_noneOp){ SendMessage(WM_COMMAND,WPARAM(ID_OPERATION_OVER)); } CScrollView::OnLButtonDblClk(nFlags, point); } ////////////////////////////////////////////////////// void CGraphSoftView::SetDrawMenuEnable(bool bEnable) { m_bCanSelectGraphType=bEnable; } void CGraphSoftView::OnUpdateDrawDdaline(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Line?1:0); } void CGraphSoftView::OnDrawRectangle() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Rectangle) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Rectangle; OnOperationOver() ; } void CGraphSoftView::OnDrawRoundrect() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_RoundRect) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_RoundRect; OnOperationOver() ; } void CGraphSoftView::OnDrawPolygon() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Polygon) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Polygon; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawPolygon(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Polygon?1:0); } void CGraphSoftView::OnUpdateDrawRectangle(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Rectangle?1:0); } void CGraphSoftView::OnUpdateDrawRoundrect(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_RoundRect?1:0); } void CGraphSoftView::OnDrawEllipse() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Ellipse) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Ellipse; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawEllipse(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Ellipse?1:0); } void CGraphSoftView::OnDrawCircle() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Circle) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Circle; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawCircle(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Circle?1:0); } void CGraphSoftView::OnDrawParallelogram() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_Parallelogram) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_Parallelogram; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawParallelogram(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_Parallelogram?1:0); } void CGraphSoftView::OnDrawNone() { // TODO: Add your command handler code here GetDocument()->m_nCurrentShapeType=_shape_none; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawNone(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_none?1:0); } void CGraphSoftView::OnDrawModelcurve2avb() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_ModelCurve2AvB) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_ModelCurve2AvB; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawModelcurve2avb(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_ModelCurve2AvB?1:0); } void CGraphSoftView::OnDrawModelcurve3param() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_ModelCurve3Param) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_ModelCurve3Param; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawModelcurve3param(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_ModelCurve3Param?1:0); } void CGraphSoftView::OnDrawBeziercurve() { // TODO: Add your command handler code here if(GetDocument()->m_nCurrentShapeType ==_shape_BezierCurve) GetDocument()->m_nCurrentShapeType=_shape_none; else GetDocument()->m_nCurrentShapeType=_shape_BezierCurve; OnOperationOver() ; } void CGraphSoftView::OnUpdateDrawBeziercurve(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bCanSelectGraphType); pCmdUI->SetCheck(GetDocument()->m_nCurrentShapeType==_shape_BezierCurve?1:0); } ////////////////////////////////////////////////////// CRect CGraphSoftView::GetSelectGraphBoundaryRect() { CRect rectRltVal(0,0,0,0); rectRltVal=GetDocument()->GetSelectGraphBoundaryRect(); m_rectSelectGraph=rectRltVal; return rectRltVal; } /////////////////////////////////////////////////////// //function----RefreshSelectGraph //一般用于旋转和缩放选中图形后对数据的图形数据的更新 //////////////////////////////////////////////////// ////////////////////////////////////////////////////// CPoint CGraphSoftView::GetSelectGraphCenter() { CRect rect=GetSelectGraphBoundaryRect(); //m_ptSelectGraphCenter=rect.CenterPoint(); return m_ptSelectGraphCenter; } ////////////////////////////////////////////////////// void CGraphSoftView::OnGraphMove() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_move; m_bGraphOp=TRUE; } void CGraphSoftView::OnGraphMagnify() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_magnify; m_bGraphOp=TRUE; CClientDC dc(this); OnPrepareDC(&dc); int old_rop = dc.SetROP2(R2_XORPEN); CRect rect; rect=GetSelectGraphBoundaryRect(); m_ptSelectGraphCenter=rect.CenterPoint(); //Redraw(&dc,&rect,TRUE,RGB(255,255,0)); CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); poldPen=dc.SelectObject(&pen); float flLx,flRx,flTy,flBy; flLx=m_rectSelectGraph.left/1000.0; flTy=m_rectSelectGraph.top/1000.0; flRx=m_rectSelectGraph.right/1000.0; flBy=m_rectSelectGraph.bottom/1000.0; Lp2Dp(flLx,flTy); Lp2Dp(flRx,flBy); dc.MoveTo(flLx,flTy); dc.LineTo(flLx,flBy); dc.LineTo(flRx,flBy); dc.LineTo(flRx,flTy); dc.LineTo(flLx,flTy); dc.SelectObject(poldPen); float flxTemp,flyTemp; flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); dc.SetROP2(old_rop); } void CGraphSoftView::OnGraphRotate() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_rotate; m_bGraphOp=TRUE; m_ptSelectGraphCenter=GetSelectGraphBoundaryRect().CenterPoint(); m_flRotCenterX=m_ptSelectGraphCenter.x/1000.0; m_flRotCenterY=m_ptSelectGraphCenter.y/1000.0; float flx,fly; flx=m_flRotCenterX; fly=m_flRotCenterY; Lp2Dp(flx,fly); m_bSelectRotateCenter=FALSE; CClientDC dc(this); OnPrepareDC(&dc); int old_rop = dc.SetROP2(R2_XORPEN); DrawOutRectPoint(&dc,flx,fly,RGB(0,255,0)); TRACE("OnGraphRotate()---Logical RotateCenter(%f,%f)\n",m_flRotCenterX,m_flRotCenterY); TRACE("OnGraphRotate()---Device RotateCenter(%f,%f)\n",flx,fly); // dc.SetPixel(m_ptRotateCenter.x-1,m_ptRotateCenter.y-1,RGB(0,255,0)); // dc.SetPixel(m_ptRotateCenter.x-1,m_ptRotateCenter.y+1,RGB(0,255,0)); // dc.SetPixel(m_ptRotateCenter.x+1,m_ptRotateCenter.y-1,RGB(0,255,0)); // dc.SetPixel(m_ptRotateCenter.x+1,m_ptRotateCenter.y+1,RGB(0,255,0)); dc.SetROP2(old_rop); } void CGraphSoftView::OnGraphPropertiy() { // TODO: Add your command handler code here CGraphInfoDlg dlg(this); SUNDProperty *pSProperty=new SUNDProperty(); GetDocument()->GetSelGraphPropertyArr(pSProperty->ArrPropertyPrev); if(dlg.DoModal()==IDOK){ GetDocument()->GetSelGraphPropertyArr(pSProperty->ArrPropertyCur); for(int i=0;i ArrPropertyCur.GetSize();i++){ SUNDPropertyUnit& SPropertyUnitPrev = pSProperty->ArrPropertyPrev.GetAt(i); SPropertyUnitPrev.flRCX=GetDocument()->GetSelectGraphBoundaryRect().CenterPoint().x/1000.0; SPropertyUnitPrev.flRCY=GetDocument()->GetSelectGraphBoundaryRect().CenterPoint().y/1000.0; SPropertyUnitPrev.flAngle=dlg.m_nAngle*PI/180; pSProperty->ArrPropertyPrev.SetAt(i,SPropertyUnitPrev); SUNDPropertyUnit& SPropertyUnitCur = pSProperty->ArrPropertyCur.GetAt(i); SPropertyUnitCur.flRCX=GetDocument()->GetSelectGraphBoundaryRect().CenterPoint().x/1000.0; SPropertyUnitCur.flRCY=GetDocument()->GetSelectGraphBoundaryRect().CenterPoint().y/1000.0; SPropertyUnitCur.flAngle=-dlg.m_nAngle*PI/180; pSProperty->ArrPropertyCur.SetAt(i,SPropertyUnitCur); } CUND_Base* pUndo = new CUND_Property(pSProperty); GetDocument()->m_pCore->AddUndoItem(pUndo); }else{ delete pSProperty; } } void CGraphSoftView::OnGraphDelete() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_delete; m_bGraphOp=TRUE; SUNDDelete *pStructDel=new SUNDDelete(); GetDocument()->GetSelGraphArray(pStructDel->ArrShape); CUND_Base* pUndo = new CUND_Delete(pStructDel); GetDocument()->m_pCore->AddUndoItem(pUndo); CClientDC dc(this); OnPrepareDC(&dc); CRect rect=GetSelectGraphBoundaryRect(); POSITION pos,posPrev; pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { posPrev=pos; CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ GetDocument()->m_shapeList.RemoveAt(posPrev); pShape->DrawCutToRect(&dc,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); } } rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect,FALSE); } void CGraphSoftView::OnGraphCopy() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_copy; m_bGraphOp=TRUE; CGraphSoftDoc * pDoc=(CGraphSoftDoc *)GetDocument(); CClientDC dc(this); OnPrepareDC(&dc); //CRect rect=GetSelectGraphBoundaryRect(); POSITION pos; pos=pDoc->m_shapeList.GetHeadPosition(); int nshapeCount=pDoc->m_shapeList.GetCount(); while ((nshapeCount--)!=0) { CShape* pShape=pDoc->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ CShape* pShapeNew=pShape->GetCopy(); pDoc->m_shapeList.AddTail(pShapeNew); pShape->SetSelectFlag(FALSE); } } } void CGraphSoftView::OnGraphEdit() { // TODO: Add your command handler code here m_bDrawFlag=FALSE; m_graph_op=_graph_edit; m_bGraphOp=TRUE; CShape* pShape=NULL; POSITION pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ break; } } if(pShape!=NULL){ pShape->GetPtData(m_ArrDataPrevX,m_ArrDataPrevY); } } void CGraphSoftView::OnGraphPointshide() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); GetDocument()->SetGraphDrawPtFlag(0,&dc); SUNDShowPoints *pStructShowPts=new SUNDShowPoints(); GetDocument()->GetSelGraphIDArray(pStructShowPts->ArrId); pStructShowPts->nShowFlag=0; CUND_Base* pUndo = new CUND_ShowPoints(pStructShowPts); GetDocument()->m_pCore->AddUndoItem(pUndo); // m_bDrawFlag=FALSE; // m_bGraphOp=TRUE; // m_graph_op= _graph_pointsHide; } void CGraphSoftView::OnGraphPointsshow() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); GetDocument()->SetGraphDrawPtFlag(1,&dc); SUNDShowPoints *pStructShowPts=new SUNDShowPoints(); GetDocument()->GetSelGraphIDArray(pStructShowPts->ArrId); pStructShowPts->nShowFlag=1; CUND_Base* pUndo = new CUND_ShowPoints(pStructShowPts); GetDocument()->m_pCore->AddUndoItem(pUndo); // m_bDrawFlag=FALSE; // m_bGraphOp=TRUE; // m_graph_op= _graph_pointsShow; } void CGraphSoftView::OnGraphLefttoright() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); SUNDLeftToRight *pStructLfToRt=new SUNDLeftToRight(); GetDocument()->GetSelGraphIDArray(pStructLfToRt->ArrId); pStructLfToRt->rtOut=GetDocument()->GetSelectGraphBoundaryRect(); CUND_Base* pUndo = new CUND_LeftToRight(pStructLfToRt); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->GraphLeftToRight(&dc); // m_bDrawFlag=FALSE; // m_bGraphOp=TRUE; // m_graph_op= _graph_leftToRight; } void CGraphSoftView::OnGraphToptobottom() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); SUNDLeftToRight *pStructTpToBm=new SUNDLeftToRight(); GetDocument()->GetSelGraphIDArray(pStructTpToBm->ArrId); pStructTpToBm->rtOut=GetDocument()->GetSelectGraphBoundaryRect(); CUND_Base* pUndo = new CUND_TopToBtm(pStructTpToBm); GetDocument()->m_pCore->AddUndoItem(pUndo); GetDocument()->GraphTopToBottom(&dc); // m_bDrawFlag=FALSE; // m_bGraphOp=TRUE; // m_graph_op= _graph_topTobottom; } ///////////////////////////////////////////////////////// void CGraphSoftView::OnDestroy() { // TODO: Add your message handler code here CScrollView::OnDestroy(); } BOOL CGraphSoftView::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class return CScrollView::DestroyWindow(); } ////////////////////////////////////////////////////////// void CGraphSoftView::OnSelectAll() { // TODO: Add your command handler code here POSITION pos; CClientDC dc(this); OnPrepareDC(&dc); pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); pShape->SetSelectFlag(TRUE); pShape->DrawCutToRect(&dc,RGB(255,0,0),RGB(255,0,0),m_rectTarget,m_rectMaxWindow); } } ////////////////////////////////////////////////////// void CGraphSoftView::OnUpdateSelectAll(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here if(m_graph_op==_graph_noneOp&&GetDocument()->m_nCurrentShapeType==_shape_none && GetDocument()->m_shapeList.GetCount()!=0){ pCmdUI->Enable(TRUE); }else{ pCmdUI->Enable(FALSE); } } ///////////////////////////////////////////////////////////////// void CGraphSoftView::OnOperationOver() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); int old_rop = dc.SetROP2(R2_XORPEN); if(m_bGraphOp!=FALSE){ float flxTemp,flyTemp; switch(m_graph_op){ case _graph_copy: { dc.SetROP2(old_rop); CRect rect=GetSelectGraphBoundaryRect(); POSITION pos,posPrev; pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { posPrev=pos; CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ GetDocument()->m_shapeList.RemoveAt(posPrev); pShape->DrawCutToRect(&dc,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); delete pShape; } } rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect,FALSE); dc.SetROP2(R2_XORPEN); m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_magnify: { int old_rop = dc.SetROP2(R2_XORPEN); flxTemp=m_ptSelectGraphCenter.x/1000.0; flyTemp=m_ptSelectGraphCenter.y/1000.0; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; CPen pen,*poldPen; pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); poldPen=dc.SelectObject(&pen); float flLx,flRx,flTy,flBy; flLx=m_rectSelectGraph.left/1000.0; flTy=m_rectSelectGraph.top/1000.0; flRx=m_rectSelectGraph.right/1000.0; flBy=m_rectSelectGraph.bottom/1000.0; Lp2Dp(flLx,flTy); Lp2Dp(flRx,flBy); dc.MoveTo(flLx,flTy); dc.LineTo(flLx,flBy); dc.LineTo(flRx,flBy); dc.LineTo(flRx,flTy); dc.LineTo(flLx,flTy); dc.SelectObject(poldPen); dc.SetROP2(old_rop); break; } case _graph_rotate: { flxTemp=m_flRotCenterX; flyTemp=m_flRotCenterY; Lp2Dp(flxTemp,flyTemp); DrawOutRectPoint(&dc,flxTemp,flyTemp,RGB(0,255,0)); // Redraw(&dc,&m_rectSelectGraph,TRUE,RGB(255,255,255)); // CPen pen,*poldPen; // pen.CreatePen(PS_SOLID,1, RGB(255,255,0)); // poldPen=pDC->SelectObject(&pen); // pDC->MoveTo(rect.TopLeft()); // pDC->LineTo(rect.left,rect.bottom); // pDC->LineTo(rect.right,rect.bottom); // pDC->LineTo(rect.right,rect.top); // pDC->LineTo(rect.TopLeft()); // pDC->SelectObject(poldPen); m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; break; } case _graph_edit: { CShape* pShape=NULL; POSITION pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ break; } } if(pShape!=NULL){ SUNDEdit *pStructEdit=new SUNDEdit(); pStructEdit->nID=pShape->GetID(); pStructEdit->ArrDataPrevX.Copy(m_ArrDataPrevX); pStructEdit->ArrDataPrevY.Copy(m_ArrDataPrevY); pShape->GetPtData(pStructEdit->ArrDataCurX,pStructEdit->ArrDataCurY); CUND_Base* pUndo = new CUND_Edit(pStructEdit); GetDocument()->m_pCore->AddUndoItem(pUndo); } } default: // m_bGraphOp=FALSE; // m_graph_op=_graph_noneOp; break; } } m_bGraphOp=FALSE; m_graph_op=_graph_noneOp; dc.SetROP2(old_rop); CRect rect(0,0,0,0); //SetDrawMenuEnable(TRUE); GetDocument()->SelectInRect(&rect,&dc,0,TRUE); } void CGraphSoftView::OnUpdateGraphDelete(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphCopy(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphMagnify(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphMove(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphPropertiy(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphRotate(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphToptobottom(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphEdit(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->GetSelectNum()==1); } void CGraphSoftView::OnUpdateGraphLefttoright(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphPointshide(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphPointsshow(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphRotateLeft(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateGraphRotateRight(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(GetDocument()->HasGraphSelected()); } void CGraphSoftView::OnUpdateOperationOver(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_graph_op!=_graph_noneOp); } void CGraphSoftView::OnUpdateSelectPenwidth(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } ///////////////////////////////////////////////////////// BOOL CGraphSoftView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default if(m_graph_op==_graph_noneOp&&GetDocument()->m_nCurrentShapeType==_shape_none) { if(GetDocument()->HasGraphSelected()){ SetCursor(AfxGetApp()->LoadCursor(IDC_SELECT_ANY)); }else{ SetCursor(AfxGetApp()->LoadCursor(IDC_SELECT_NONE)); } return true ; } switch(GetDocument()->m_nCurrentShapeType){ case _shape_Line: //SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_LINE)); //SetCursor(LoadCursorFromFile("dinosaur.ani")); SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_LINE)); return true; case _shape_Parallelogram: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_PARAGLLELOGRAM)); return true; case _shape_Rectangle: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_RECTANGLE)); return true; case _shape_RoundRect: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_ROUNDRECT)); return true; case _shape_Circle: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_CIRCLE)); return true; case _shape_Ellipse: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_ELLIPSE)); return true; case _shape_Polygon: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_POLYGON)); return true; case _shape_ModelCurve3Param: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_MODELCURVE3PARAM)); return true; case _shape_ModelCurve2AvB: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_MODELCURVE2AVB)); return true; case _shape_BezierCurve: SetCursor(AfxGetApp()->LoadCursor(IDC_SHAPE_BEZIERCURVE)); return true; default: break; } switch(m_graph_op){ case _graph_rotate: SetCursor(AfxGetApp()->LoadCursor(IDC_GRAPH_ROTATE)); return true; case _graph_move: SetCursor(AfxGetApp()->LoadCursor(IDC_GRAPH_MOVE)); return true; case _graph_magnify: SetCursor(AfxGetApp()->LoadCursor(IDC_GRAPH_MAGNIFY)); return true; case _graph_copy: SetCursor(AfxGetApp()->LoadCursor(IDC_GRAPH_COPY)); return true; case _graph_edit: //SetCursor(AfxGetApp()->LoadCursor(IDC_GRAPH_POINTSEL)); //return true; default: break; } return false; //return CScrollView::OnSetCursor(pWnd, nHitTest, message); } void CGraphSoftView::OnGraphRotatecenterSet() { // TODO: Add your command handler code here m_bSelectRotateCenter=!m_bSelectRotateCenter; if(!m_bSelectRotateCenter){ m_flRotCenterX=m_ptSelectGraphCenter.x/1000.0; m_flRotCenterY=m_ptSelectGraphCenter.y/1000.0; } } void CGraphSoftView::OnUpdateGraphRotatecenterSet(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_bSelectRotateCenter?1:0); } void CGraphSoftView::OnGraphRotateLeft() { // TODO: Add your command handler code here m_ptSelectGraphCenter=GetSelectGraphBoundaryRect().CenterPoint(); m_flRotCenterX=m_ptSelectGraphCenter.x/1000.0; m_flRotCenterY=m_ptSelectGraphCenter.y/1000.0; POSITION pos; CClientDC dc(this); OnPrepareDC(&dc); //int old_rop = dc.SetROP2(R2_XORPEN); pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ pShape->DrawCutToRect(&dc,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); pShape->Rotate(&dc,m_flRotCenterX,m_flRotCenterY,-PI/2); pShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); } } CRect rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); GetDocument()->RefreshSelectGraph(); rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); //dc.SetROP2(old_rop); } void CGraphSoftView::OnGraphRotateRight() { // TODO: Add your command handler code here m_ptSelectGraphCenter=GetSelectGraphBoundaryRect().CenterPoint(); m_flRotCenterX=m_ptSelectGraphCenter.x/1000.0; m_flRotCenterY=m_ptSelectGraphCenter.y/1000.0; POSITION pos; CClientDC dc(this); OnPrepareDC(&dc); pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ pShape->DrawCutToRect(&dc,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); pShape->Rotate(&dc,m_flRotCenterX,m_flRotCenterY,PI/2); pShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); } } CRect rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); GetDocument()->RefreshSelectGraph(); rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); } void CGraphSoftView::OnInputConfirm() { // TODO: Add your command handler code here if(m_pCurrentShape!=NULL){ CClientDC dc(this); OnPrepareDC(&dc); m_flArrayX.RemoveAll(); m_flArrayY.RemoveAll(); switch(GetDocument()->m_nCurrentShapeType) { case _shape_Polygon: case _shape_ModelCurve3Param: case _shape_ModelCurve2AvB: case _shape_BezierCurve: { int old_rop = dc.SetROP2(R2_XORPEN); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); dc.SetROP2(old_rop); m_pCurrentShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); break; } default: break; }//switch{case:} } m_pCurrentShape=NULL; m_bDrawFlag=FALSE; ClipCursor(NULL); return; } void CGraphSoftView::OnShapeOver() { // TODO: Add your command handler code here CClientDC dc(this); OnPrepareDC(&dc); int old_rop = dc.SetROP2(R2_XORPEN); CRect rect; if(m_flArrayX.GetSize()>0){ if(GetDocument()->m_nCurrentShapeType==_shape_Parallelogram){ if(m_flArrayX.GetSize()<3){ int old_rop = dc.SetROP2(R2_XORPEN); //rect=GetRectFromPoint(m_ptStart,m_ptPrev); float x1=m_flStartX; float y1=m_flStartY; float x2=m_flPrevX; float y2=m_flPrevY; Lp2Dp(x1,y1);//转回屏幕坐标,易于画图 Lp2Dp(x2,y2); DrawLine(&dc,x1,y1,x2,y2,RGB(0,255,0),m_nCurrentPenWidth+1); dc.SetROP2(old_rop); } } m_flArrayX.RemoveAll(); m_flArrayY.RemoveAll(); if(m_pCurrentShape!=NULL){ rect=m_pCurrentShape->GetBoundaryRect(); m_pCurrentShape->DrawCutToRect(&dc,RGB(0,255,0),RGB(255,0,255),m_nCurrentPenWidth+1,m_rectTarget,m_rectMaxWindow); GetDocument()->m_shapeList.RemoveTail(); // delete m_pCurrentShape;//内存泄漏 m_pCurrentShape=NULL; // Redraw(&dc,&rect,FALSE); GetDocument()->m_pCore->DelLastUndoItem();//删除撤消项,这里将删除为新图形分配的空间 } } GetDocument()->m_nCurrentShapeType=_shape_none; m_bDrawFlag=FALSE; ClipCursor(NULL); dc.SetROP2(old_rop); return; } void CGraphSoftView::OnUpdateInputConfirm(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } void CGraphSoftView::OnSelectPenwidth() { // TODO: Add your command handler code here } void CGraphSoftView::OnSelectFillColor() { // TODO: Add your command handler code here } BOOL CGraphSoftView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class BOOL rlt= CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); return rlt; } void CGraphSoftView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) { // TODO: Add your specialized code here and/or call the base class CScrollView::CalcWindowRect(lpClientRect, nAdjustType); } void CGraphSoftView::DrawCut() { CClientDC dc(this); OnPrepareDC(&dc); OnEraseBkgnd(&dc) ; CGraphSoftDoc* pDoc=GetDocument(); POSITION pos; pos=pDoc->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=pDoc->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ pShape->DrawCutToRect(&dc,RGB(255,0,0),RGB(255,0,0),m_rectTarget,m_rectMaxWindow); }else{ pShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); } } } BOOL CGraphSoftView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default CBrush* pBrush = new CBrush ; // pBrush->CreateSolidBrush(RGB(0,0,0)); CRect rect ; CBrush *pOldBrush = (CBrush*)pDC->SelectObject(pBrush) ; pDC->GetClipBox(&rect) ; pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY) ; pDC->SelectObject(pOldBrush) ; // pDC->SetBkColor(COLORREF(RGB(128,128,128))) ; // GetClientRect(rect) ; delete pBrush; return TRUE; } ///////////////////////////////////////////////////////////////////// void CGraphSoftView::Lp2Dp(CPoint* pPt) { pPt->x=((float)pPt->x)*m_rectMaxWindow.Width()/m_rectTarget.Width()+0.5; pPt->y=((float)pPt->y)*m_rectMaxWindow.Height()/m_rectTarget.Height()+0.5; } void CGraphSoftView::Lp2Dp(CRect* pRect) { float flRate=((float)m_rectMaxWindow.Width())/m_rectTarget.Width(); pRect->left=((float)pRect->left-m_rectTarget.left)*flRate+0.5; pRect->right=((float)pRect->right-m_rectTarget.left)*flRate+0.5; pRect->top=((float)pRect->top-m_rectTarget.top)*flRate+0.5; pRect->bottom=((float)pRect->bottom-m_rectTarget.top)*flRate+0.5; } void CGraphSoftView::Dp2Lp(CPoint* pPt) { pPt->x=m_rectTarget.left+((float)pPt->x)*m_rectTarget.Width()/(float)m_rectMaxWindow.Width()+0.5; pPt->y=m_rectTarget.top+((float)pPt->y)*m_rectTarget.Width()/(float)m_rectMaxWindow.Width()+0.5; } void CGraphSoftView::Dp2Lp(CRect* pRect) { pRect->left=m_rectTarget.left+((float)pRect->left)*m_rectTarget.Width()/m_rectMaxWindow.Width()+0.5; pRect->right=m_rectTarget.left+((float)pRect->right)*m_rectTarget.Width()/m_rectMaxWindow.Width()+0.5; pRect->top=m_rectTarget.top+((float)pRect->top)*m_rectTarget.Height()/m_rectMaxWindow.Height()+0.5; pRect->bottom=m_rectTarget.top+((float)pRect->bottom)*m_rectTarget.Height()/m_rectMaxWindow.Height()+0.5; } void CGraphSoftView::Lp2Dp(float& flX,float& flY) { // CSize sz; // this->GetScrollBarSizes(sz); // float flRate=((float)m_rectMaxWindow.Width())/sz.cx; flX=flX*m_flRate; flY=flY*m_flRate; // float flRate=((float)m_rectMaxWindow.Width()/m_rectTarget.Width()); // flX=(flX-m_rectTarget.left)*flRate+0.5; // flY=(flY-m_rectTarget.top)*flRate+0.5; } void CGraphSoftView::Dp2Lp(float& flX,float& flY) { // CSize sz; // this->GetScrollBarSizes(sz); // float flRate=((float)sz.cx)/m_rectMaxWindow.Width(); flX=flX/m_flRate; flY=flY/m_flRate; // flX=m_rectTarget.left+flX*m_rectTarget.Width()/(float)m_rectMaxWindow.Width(); // flY=m_rectTarget.top+flY*m_rectTarget.Width()/(float)m_rectMaxWindow.Width(); } ////////////////////////////////////////////////////////////////////////////////// void CGraphSoftView::OnSelGraphPoint(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); OnPrepareDC(&dc); int nFlag=(int)wParam; GetDocument()->SetGraphDrawPtFlag(nFlag,&dc); } void CGraphSoftView::OnSelGraphRotate(WPARAM wParam,LPARAM lParam) { float angle=(int)wParam; m_ptSelectGraphCenter=GetSelectGraphBoundaryRect().CenterPoint(); m_flRotCenterX=m_ptSelectGraphCenter.x/1000.0; m_flRotCenterY=m_ptSelectGraphCenter.y/1000.0; POSITION pos; CClientDC dc(this); OnPrepareDC(&dc); //int old_rop = dc.SetROP2(R2_XORPEN); pos=GetDocument()->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=GetDocument()->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ pShape->DrawCutToRect(&dc,RGB(255,255,255),RGB(255,255,255),m_rectTarget,m_rectMaxWindow); pShape->Rotate(&dc,m_flRotCenterX,m_flRotCenterY,-angle*PI/180); pShape->DrawCutToRect(&dc,m_rectTarget,m_rectMaxWindow); } } CRect rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); GetDocument()->RefreshSelectGraph(); rect=GetDocument()->GetSelectGraphBoundaryRect(); rect.left/=1000; rect.top/=1000; rect.right/=1000; rect.bottom/=1000; Redraw(&dc,&rect); } void CGraphSoftView::OnSelGraphColor(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); OnPrepareDC(&dc); COLORREF color=(COLORREF)wParam; GetDocument()->SetSelGraphColor(color,&dc); } void CGraphSoftView::OnSelGraphFillClr(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); OnPrepareDC(&dc); COLORREF color=(COLORREF)wParam; GetDocument()->SetSelGraphFillClr(color,&dc); } void CGraphSoftView::OnSelGraphFillSty(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); OnPrepareDC(&dc); int nStyle=(int)wParam; GetDocument()->SetSelGraphFillSty((SHAPE_FILLSTYLE)nStyle,&dc); } void CGraphSoftView::OnSelGraphPenWidth(WPARAM wParam,LPARAM lParam) { CClientDC dc(this); OnPrepareDC(&dc); int nWidth=(int)wParam; GetDocument()->SetSelGraphPenWidth(nWidth,&dc); } ////////////////////////////////////////////////////////////////////////////////// //End of File void CGraphSoftView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: Add your specialized code here and/or call the base class CRect rect=pInfo->m_rectDraw;//转窗口大小 rect.DeflateRect(rect.Width()/15,rect.Height()/16); //画图 CGraphSoftDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); POSITION pos; pos=pDoc->m_shapeList.GetHeadPosition(); while (pos!=NULL) { CShape* pShape=pDoc->m_shapeList.GetNext(pos); if(pShape->IsSelected()){ //pShape->DrawCutToRect(pDC,RGB(255,0,0),RGB(255,0,0),m_rectTarget,m_rectMaxWindow); pShape->DrawCutToRect(pDC,m_rectTarget,rect); }else{ pShape->DrawCutToRect(pDC,m_rectTarget,rect); } } //清除四边空间 CBrush newBrush; newBrush.CreateSolidBrush(RGB(255,255,255)); CBrush *pOldBrush = (CBrush*)pDC->SelectObject(&newBrush) ; this->GetClientRect(&rect) ; rect.InflateRect(3,2); pDC->PatBlt(0,0,pInfo->m_rectDraw.Width()/15.0,pInfo->m_rectDraw.Height(),PATCOPY) ; pDC->PatBlt(0,0,pInfo->m_rectDraw.Width(),pInfo->m_rectDraw.Height()/16.0,PATCOPY) ; pDC->PatBlt(0,15*pInfo->m_rectDraw.Height()/16.0,pInfo->m_rectDraw.Width(),pInfo->m_rectDraw.Height()/16.0,PATCOPY) ; pDC->PatBlt(14*pInfo->m_rectDraw.Width()/15.0,0,pInfo->m_rectDraw.Width()/15.0,pInfo->m_rectDraw.Height(),PATCOPY) ; //画页眉底线 CPen pen,*pOldPen; pen.CreatePen(PS_SOLID,pInfo->m_rectDraw.Width()/200+1,RGB(0,0,0)); pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(pInfo->m_rectDraw.Width()/15.0,pInfo->m_rectDraw.Height()/20.0); pDC->LineTo(14.0*pInfo->m_rectDraw.Width()/15.0,pInfo->m_rectDraw.Height()/20); pDC->SelectObject(pOldPen); //写页眉 CRect rectTop(0,0,pInfo->m_rectDraw.Width(),pInfo->m_rectDraw.Height()/16.0); CFont font; LOGFONT lf; memset(&lf, 0, sizeof(LOGFONT)); // zero out structure lf.lfHeight = pInfo->m_rectDraw.Height()/40; lf.lfWidth = pInfo->m_rectDraw.Width()/40; // request a 12-pixel-height font strcpy(lf.lfFaceName, "Arial"); // request a face name "Arial" VERIFY(font.CreateFontIndirect(&lf)); // create the font // Do something with the font just created... CFont* def_font = pDC->SelectObject(&font); pDC->DrawText("Made by GraphSoft",&rectTop,DT_CENTER | DT_VCENTER | DT_SINGLELINE); pDC->SelectObject(pOldBrush) ; pDC->SelectObject(def_font); // Done with the font. Delete the font object. font.DeleteObject(); newBrush.DeleteObject(); ScrollToPosition(m_rectMaxWindow.TopLeft()); } void CGraphSoftView::OnInitialUpdate() { SetScrollSizes(MM_TEXT,CSize(0,0)); // TODO: Add your specialized code here and/or call the base class } void CGraphSoftView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { // TODO: Add your specialized code here and/or call the base class CScrollView::OnPrepareDC(pDC, pInfo); } void CGraphSoftView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default float left = this->GetScrollPos(SB_HORZ); CMainFrame* pMainFrm = (CMainFrame*) AfxGetApp()->GetMainWnd(); float flOffsetRate = ((float)left-m_rectMaxWindow.left)/(m_flRate*m_rectMaxWindow.Width()); float flViewMaxOffset = left-m_rectMaxWindow.left; float flViewTargetOffset = flViewMaxOffset*((float)m_rectTarget.Width())/m_rectMaxWindow.Width(); float flFullViewOffset = flOffsetRate*pMainFrm->m_wndFullView.m_pBtn->m_MaxRect.Width(); pMainFrm->m_wndFullView.m_pBtn->m_targetrect.OffsetRect(flFullViewOffset,0); m_rectMaxWindow.OffsetRect(flViewMaxOffset,0); m_rectTarget.OffsetRect(flViewTargetOffset,0); pMainFrm->m_wndFullView.m_pBtn->Invalidate(TRUE); // Invalidate(TRUE); CScrollView::OnHScroll(nSBCode, nPos, pScrollBar); } void CGraphSoftView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default float limit = this->GetScrollLimit(SB_VERT); float top = this->GetScrollPos(SB_VERT); CMainFrame* pMainFrm = (CMainFrame*) AfxGetApp()->GetMainWnd(); float flOffsetRate = ((float)top-m_rectMaxWindow.top)/(m_flRate*m_rectMaxWindow.Height()); float flViewMaxOffset = top-m_rectMaxWindow.top; float flViewTargetOffset = flViewMaxOffset*((float)m_rectTarget.Width())/m_rectMaxWindow.Width(); float flFullViewOffset = flOffsetRate*pMainFrm->m_wndFullView.m_pBtn->m_MaxRect.Height(); pMainFrm->m_wndFullView.m_pBtn->m_targetrect.OffsetRect(0,flFullViewOffset); m_rectMaxWindow.OffsetRect(0,flViewMaxOffset); m_rectTarget.OffsetRect(0,flViewTargetOffset); pMainFrm->m_wndFullView.m_pBtn->Invalidate(TRUE); // Invalidate(TRUE); CScrollView::OnVScroll(nSBCode, nPos, pScrollBar); } void CGraphSoftView::OnHelpfile() { // TODO: Add your command handler code here ShellExecute(NULL, "open", "GSHelpFile.chm", NULL, NULL, SW_SHOWNORMAL); }