// CGraph.cpp: implementation of the CGraph class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" //#include #include "drawobj.h" #include "graph.h" //---------------------------------------------- CGraph --------- CGraph::CGraph(CSize size) { m_Type = 1; m_sizePic.cx = size.cx; m_sizePic.cy = size.cy; m_bGrid = FALSE; m_sizeGrid.cx = 40; m_sizeGrid.cy = 40; m_clrBack = RGB(230, 241, 249);//RGB(255, 255, 255);//RGB(92, 92, 92);画面默认背景 颜色 } CGraph::~CGraph(void) { #if GRAPH_DEBUG if(!m_DrawObjList.IsEmpty()) { for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; //要在这里做一个备份 CDrawObj *ct = (CDrawObj *)m_DrawObjList.GetNext(pos);//他会改变 pos的值 m_DrawObjList.RemoveAt(pos1); delete ct; } m_DrawObjList.RemoveAll(); ASSERT(m_DrawObjList.IsEmpty()); } #else POSITION pos = m_DrawObjList.GetHeadPosition(); while(pos!=NULL) delete m_DrawObjList.GetNext(pos); m_DrawObjList.RemoveAll(); #endif } void CGraph::SetPicFile(CString strPicFile) { m_strPicFile = strPicFile; } void CGraph::SetView(CView* pView) { m_pView = pView; #if GRAPH_DEBUG if(!m_DrawObjList.IsEmpty()) { for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; //要在这里做一个备份 CDrawObj* pObj = m_DrawObjList.GetAt(pos1); pObj->m_pView = m_pView; m_DrawObjList.GetNext(pos);//他会改变 pos的值 } } #else POSITION pos = m_DrawObjList.GetHeadPosition(); while(pos!=NULL) { CDrawObj* pObj = m_DrawObjList.GetNext(pos); pObj->m_pView = m_pView; } #endif } void CGraph::Load(void) { #if GRAPH_DEBUG CView* _pView=NULL; if(!m_DrawObjList.IsEmpty()) { for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; //要在这里做一个备份 CDrawObj *ct = (CDrawObj *)m_DrawObjList.GetNext(pos);//他会改变 pos的值 _pView = ct->m_pView; m_DrawObjList.RemoveAt(pos1); delete ct; } m_DrawObjList.RemoveAll(); ASSERT(m_DrawObjList.IsEmpty()); } #else POSITION pos = m_DrawObjList.GetHeadPosition(); while(pos!=NULL) delete m_DrawObjList.GetNext(pos); m_DrawObjList.RemoveAll(); #endif CFile file; if(file.Open(m_strPicFile,CFile::modeRead)) { CArchive ar(&file,CArchive::load); ar >> m_Type; ar >> m_sizePic; ar >> m_sizeGrid; ar >> m_bGrid; ar >> m_clrBack; m_DrawObjList.Serialize(ar); //编辑按钮控件数次,有撤销显示时,继续编辑,点击撤销,客户端会崩溃 解决 if(!m_DrawObjList.IsEmpty() && _pView ) { for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; CDrawObj *ct = (CDrawObj *)m_DrawObjList.GetNext(pos);ct->m_strCaption; ct->m_pView = _pView; //delete ct; } } /////////////////////////////////////// ar.Close(); file.Close(); } } void CGraph::Store(void) { CFile file; if(file.Open(m_strPicFile,CFile::modeCreate|CFile::modeWrite)) { CArchive ar(&file,CArchive::store); ar << m_Type; ar << m_sizePic; ar << m_sizeGrid; ar << m_bGrid; ar << m_clrBack; m_DrawObjList.Serialize(ar); ar.Flush(); ar.Close(); file.Flush(); file.Close(); } } CRect CGraph::Draw(CDC* pDC,CString &sOCXPath,int &iOcxIndex,BOOL bPrint) { CRect rectRet=NULL; CRect rect; if ( !bPrint ) { if (g_bRun) { m_pView->GetClientRect(rect); CRect tmp = CRect(CPoint(0,0),m_sizePic);; rect.UnionRect( rect, tmp ); pDC->FillSolidRect(rect,m_clrBack); } else { rect = CRect(CPoint(0,0),m_sizePic); pDC->FillSolidRect(rect,m_clrBack); } } pDC->SetBkMode(TRANSPARENT); // 画网格 if(!CDrawObj::bRuning && !pDC->IsPrinting() && m_bGrid && (!bPrint) ) { int r = (64+GetRValue(m_clrBack)) % 256; int g = (64+GetGValue(m_clrBack)) % 256; int b = (64+GetBValue(m_clrBack)) % 256; CPen pen(PS_DOT,1,RGB(r,g,b)); CPen* pOldPen = pDC->SelectObject(&pen); int Width = rect.Width(); int Height = rect.Height(); for(int w=0;wMoveTo(rect.left + w-1, rect.top); pDC->LineTo(rect.left + w-1, rect.bottom); } for(int h=0;hMoveTo(rect.left , rect.top + h-1); pDC->LineTo(rect.right, rect.top + h-1); } pDC->SelectObject(pOldPen); DeleteObject( pen ); } CRect rectClip; pDC->GetClipBox(&rectClip); // 画图元 #if GRAPH_DEBUG if(!m_DrawObjList.IsEmpty()) { for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; //要在这里做一个备份 CDrawObj* pObj = m_DrawObjList.GetAt(pos1); CRect rect = pObj->m_rect; rect.NormalizeRect(); rect.InflateRect(5,5,5,5); if(rect.IntersectRect(&rect,&rectClip)) { if( pObj->m_strCaption=="OCX" ) { sOCXPath = ((CDrawOCX *)pObj)->m_strOcxPath; iOcxIndex = ((CDrawOCX *)pObj)->m_nOcxIndex; rectRet = pObj->m_rect; } pObj->Draw(pDC); } m_DrawObjList.GetNext(pos);//他会改变 pos的值 } } #else POSITION pos = m_DrawObjList.GetHeadPosition(); while(pos!=NULL) { CDrawObj* pObj = m_DrawObjList.GetNext(pos); CRect rect = pObj->m_rect; rect.NormalizeRect(); rect.InflateRect(5,5,5,5); if(rect.IntersectRect(&rect,&rectClip)) pObj->Draw(pDC); } #endif // 画边框 if (!g_bRun && (!bPrint) ) { CRect rect1; CBrush brush(RGB(202,202,202)); CBrush *prb; prb=pDC->SelectObject(&brush); rect1 = CRect(0,0,m_sizePic.cx,5); pDC->FillRect(&rect1,&brush); rect1 = CRect(0,0,5,m_sizePic.cy); pDC->FillRect(&rect1,&brush); rect1 = CRect(0,m_sizePic.cy,m_sizePic.cx,m_sizePic.cy-5); pDC->FillRect(&rect1,&brush); rect1 = CRect(m_sizePic.cx,0,m_sizePic.cx-5,m_sizePic.cy); pDC->FillRect(&rect1,&brush); // 画8根线 CPen pen(PS_SOLID,1,RGB(232,232,232)); CPen* pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(1, m_sizePic.cy-1); pDC->LineTo(1, 1); pDC->LineTo(m_sizePic.cx-1, 1); CPen pen1(PS_SOLID,1,RGB(64,64,64)); pDC->SelectObject(&pen1); pDC->MoveTo(1, m_sizePic.cy-1); pDC->LineTo(m_sizePic.cx, m_sizePic.cy-1); pDC->LineTo(m_sizePic.cx, 1); CPen pen2(PS_SOLID,1,RGB(242,242,242)); pDC->SelectObject(&pen2); pDC->MoveTo(5, m_sizePic.cy-5); pDC->LineTo(m_sizePic.cx-4, m_sizePic.cy-5); pDC->LineTo(m_sizePic.cx-4, 5); CPen pen3(PS_SOLID,1,RGB(96,96,96)); pDC->SelectObject(&pen3); pDC->MoveTo(4, m_sizePic.cy-5); pDC->LineTo(4, 4); pDC->LineTo(m_sizePic.cx-5, 4); pDC->SelectObject(pOldPen); pDC->SelectObject(prb); brush.DeleteObject(); pDC->SetBkMode(OPAQUE); DeleteObject( pen ); DeleteObject( pen1 ); DeleteObject( pen2 ); DeleteObject( pen3 ); DeleteObject( brush ); } return rectRet; } void CGraph::Print(CDC* pDC) { ASSERT(m_pView); CString sTemp; int nTemp=0; CSize size = m_sizePic; CClientDC dc(m_pView); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap* pBitmap = new CBitmap; pBitmap->CreateCompatibleBitmap(&dc,size.cx,size.cy); CBitmap* pOldBitmap = dcMem.SelectObject(pBitmap); Draw(&dcMem,sTemp,nTemp,TRUE); dcMem.InvertRect(CRect(CPoint(0,0),m_sizePic)); for(int y=0;y32) { RECT rect; rect.left = nX1; rect.top = y; rect.right = x; rect.bottom = y+1; ::SetBkColor(pDC->m_hDC,RGB(nRValue0,nGValue0,nBValue0)); ::ExtTextOut(pDC->m_hDC,0,0,ETO_OPAQUE,&rect,NULL,0,NULL); nX1 = x; nRValue0 = nRValue; nGValue0 = nGValue; nBValue0 = nBValue; } } RECT rect; rect.left = nX1; rect.top = y; rect.right = x; rect.bottom = y+1; ::SetBkColor(pDC->m_hDC,RGB(nRValue0,nGValue0,nBValue0)); ::ExtTextOut(pDC->m_hDC,0,0,ETO_OPAQUE,&rect,NULL,0,NULL); } //2011-11-01 add DeleteObject( pBitmap ); dcMem.SelectObject(pOldBitmap); dcMem.DeleteDC( ); delete pBitmap; } void CGraph::Fresh(void) { #if GRAPH_DEBUG if(!m_DrawObjList.IsEmpty()) { CRect rect; for(POSITION pos = m_DrawObjList.GetHeadPosition();pos!=NULL;) { POSITION pos1 = pos ; //要在这里做一个备份 if( (int)pos1 == 0xfeeefeee ) break; // 频繁单击画面会出现异常,暂时不知道什么解决 CDrawObj* pObj = m_DrawObjList.GetAt(pos1); if( (int)pObj == 0xcdcdcdcd || (int)pObj == 0xfeeefeee || (int)pObj == 0x00000001 ) break; // 频繁单击画面会出现异常,暂时不知道什么解决 if( (int)pObj->m_pView == 0xfeeefeee || (int)pObj->m_pView == 0x00000001 ) // 频繁单击画面会出现异常,暂时不知道什么解决 { TRACE(g_strTRACE0); break; } if( pObj->Fresh(rect) ) InvalidateRect( pObj->m_pView->GetSafeHwnd(),rect,true ); m_DrawObjList.GetNext(pos);//他会改变 pos的值 } } #else POSITION pos = m_DrawObjList.GetHeadPosition(); while(pos!=NULL) { CDrawObj* pObj; pObj = m_DrawObjList.GetNext(pos); pObj->Fresh(); } #endif }