📄 paintvw.cpp
字号:
}
void CPaintobjView::OnUpdateViewScroll(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(!m_bZoomMode);
}
void CPaintobjView::OnUpdateViewZoomfit(CCmdUI* pCmdUI)
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//条件 GetUpperBound( ) ==-1指出的是数组没有元素
pCmdUI->SetCheck(m_bZoomMode);
pCmdUI->Enable((pDoc->m_Objects.GetUpperBound())>-1);
}
void CPaintobjView::OnViewZoomfit()
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CSize siz;
pDoc->GetBounds(&siz);
m_bZoomMode = TRUE;
SetScaleToFitSize(siz);
}
void CPaintobjView::OnUpdateEditCopy(CCmdUI* pCmdUI)
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pCmdUI->Enable(pDoc->m_nGraphSelect);
}
void CPaintobjView::OnUpdateEditCut(CCmdUI* pCmdUI)
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pCmdUI->Enable(pDoc->m_nGraphSelect);
}
void CPaintobjView::OnEditCut()
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// if(!pDoc->WriteClipBoard())//将图形写入剪裁板
// {AfxMessageBox("写入剪裁板出错");
// }
CPainted* pPainted;
for(int i=0;i<pDoc->m_nGraphSelect;i++)
{
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainted =(CPainted*) pDoc->GetShape(index);
if (pPainted->m_bSelect)
{
pDoc->m_Objects.RemoveAt(index);
delete pPainted;
pPainted = NULL;
break;
}
}
}
pDoc->m_nGraphSelect=0;
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
pDoc->GetPathIdMax();
pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax
Invalidate();
if (m_bZoomMode)
OnViewZoomfit();
else
OnViewScroll();
return;
}
void CPaintobjView::OnRButtonDown(UINT nFlags, CPoint point)
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
//按下右键结束Polygon的绘制
if (m_bTracking && pDoc->m_bpaintPolygon==TRUE)
{
if(pDoc->m_nCount>=3)
{
UINT type1,index1;
ASSERT(pDoc->m_pSelectedTool != NULL);
((CPaintPolygon*) pDoc->m_pSelectedTool)->m_uCount=pDoc->m_nCount;//m_npushnumber;//顶点数量
((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData=new CPnt[pDoc->m_nCount];//顶点数组
for(int i=0;i<pDoc->m_nCount;i++)
{
((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData[i].x=pDoc->PointXY[i].x;
((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData[i].y=pDoc->PointXY[i].y;
}
pDoc->m_Objects.Add(pDoc->m_pSelectedTool);
SelectClear();//放弃选中的图形元素
Invalidate();
pDoc->m_pSelectedTool->m_bSelect=TRUE;
m_npushnumber=0;//按下左键次数清零
pDoc->NoPaint();
type1=pDoc->m_pSelectedTool->m_uFigureType;
index1=pDoc->m_Objects.GetSize()-1;
BOOL bbb=pDoc->AddSelectList(type1,index1);
pDoc->m_pSelectedTool->DrawSelected(&ClientDC,this);
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
pDoc->m_pSelectedTool = NULL;
pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
pDoc->m_bZoomIn= FALSE;
pDoc->m_bZoomOut= FALSE;
m_bTracking = FALSE;
ReleaseCapture();
}
else
{
Invalidate();
m_npushnumber=0;//按下左键次数清零
pDoc->NoPaint();
pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
pDoc->m_bZoomIn= FALSE;
pDoc->m_bZoomOut= FALSE;
m_bTracking = FALSE;
ReleaseCapture();
pDoc->GenerateTool();
}
}
else//正常的右键功能
{
if(pDoc->m_bDisNodeState)
{
NodeStateReset();//节点状态复位
pDoc->m_bDisNodeState=FALSE;//不显示节点自检结果
Invalidate();
}
if(m_npushnumber==1||m_npushnumber==2)
{
Invalidate();
}
m_npushnumber=0;//按下左键次数清零
pDoc->NoPaint();
pDoc->m_bZoomIn= FALSE;
pDoc->m_bZoomOut= FALSE;
m_bTracking = FALSE;
ReleaseCapture();
SelectClear();//放弃选中的图形元素
pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
pDoc->GenerateTool();
}
// TODO: Add your message handler code here and/or call default
CScrollView::OnRButtonDown(nFlags, point);
}
void CPaintobjView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
CPnt pnt;
VPtoDP(point,pnt);
if (pDoc->m_pSelectedTool == NULL && !(pDoc->m_bZoomIn) && !(pDoc->m_bZoomOut))//m_bZoomIn= FALSE;m_bZoomOut= FALSE;
{
BOOL bhitarc;
CPainted* pPainted;
CPainted* pHit;//双击线段
CPainted* pHitNode;//双击节点
pHit = NULL;
pHitNode = NULL;
UINT somenode=0;
int indexx;//用于保存选中图形的索引
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainted = pDoc->GetShape(index);
somenode=pPainted->IsHit1(pnt);
if(somenode)
{ //清除以前选中的图形后选中当前图形
SelectClear();
pHitNode =pPainted;
indexx=index;
break;
}
if (pPainted->IsHit(pnt))
{ bhitarc=(pPainted->m_bhitarc);//TRUE表示圆弧被选中
pHit = pPainted;
break;
}
}
loop1:
if(somenode)
{
CPnt point1;
CNodeattr Nodeattr;
//pHitNode =pPainted;
if(somenode==1)
{
point1=pHitNode->returnattr1();
Nodeattr.m_fNodex=point1.x;
Nodeattr.m_fNodey=point1.y;
Nodeattr.m_uNodeId=pHitNode->m_uStartNodeId;
UINT id=pHitNode->m_uStartNodeId;
Nodeattr.m_fHeading=pHitNode->m_fStartHeading;
UINT type=pHitNode->m_uStartNodeType;
if(type&0x01) Nodeattr.m_bCheck1=TRUE;
if(type&0x02) Nodeattr.m_bCheck2=TRUE;
if(type&0x04) Nodeattr.m_bCheck3=TRUE;
if(type&0x08) Nodeattr.m_bCheck4=TRUE;
int result=Nodeattr.DoModal();
if(result==IDOK)
{
//如果更改了节点号,不能与某存在的节点号相同
//必须定义新的节点号
CPainted* pPainter;
if(id!=Nodeattr.m_uNodeId)
{
BOOL breturn=FALSE;
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainter =pDoc->GetShape(index);
if(pPainter->m_uStartNodeId==Nodeattr.m_uNodeId||pPainter->m_uEndNodeId==Nodeattr.m_uNodeId)
{
CString str="更改后的节点号不能与某存在的节点号相同,必须重新定义新的节点号!";
AfxMessageBox(str);
breturn=TRUE;
break;
}
}
if(breturn) {goto loop1;}
}
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainter =pDoc->GetShape(index);
if(pPainter->m_uStartNodeId==id)
{
pPainter->m_uStartNodeId=Nodeattr.m_uNodeId;
pPainter->m_fStartHeading=Nodeattr.m_fHeading;
type=0;
if(Nodeattr.m_bCheck1) type|=0x01;
if(Nodeattr.m_bCheck2) type|=0x02;
if(Nodeattr.m_bCheck3) type|=0x04;
if(Nodeattr.m_bCheck4) type|=0x08;
pPainter->m_uStartNodeType=type;
}
else if(pPainter->m_uEndNodeId==id)
{
pPainter->m_uEndNodeId=Nodeattr.m_uNodeId;
pPainter->m_fEndHeading=Nodeattr.m_fHeading;
type=0;
if(Nodeattr.m_bCheck1) type|=0x01;
if(Nodeattr.m_bCheck2) type|=0x02;
if(Nodeattr.m_bCheck3) type|=0x04;
if(Nodeattr.m_bCheck4) type|=0x08;
pPainter->m_uEndNodeType=type;
}
}
pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax
pHitNode->m_bSelectStartNode=TRUE;//TRUE表示图形元素起点被选中
UINT type1=pHitNode->m_uFigureType;
pHitNode->m_bSelect=TRUE;
BOOL bbb=pDoc->AddSelectList(type1,indexx);
pHitNode->DrawSelected(&ClientDC,this);
}
}
else if(somenode==2)
{
point1=pHitNode->returnattr2();
Nodeattr.m_fNodex=point1.x;
Nodeattr.m_fNodey=point1.y;
Nodeattr.m_uNodeId=pHitNode->m_uEndNodeId;
UINT id=pHitNode->m_uEndNodeId;
Nodeattr.m_fHeading=pHitNode->m_fEndHeading;
UINT type=pHitNode->m_uEndNodeType;
if(type&0x01) Nodeattr.m_bCheck1=TRUE;
if(type&0x02) Nodeattr.m_bCheck2=TRUE;
if(type&0x04) Nodeattr.m_bCheck3=TRUE;
if(type&0x08) Nodeattr.m_bCheck4=TRUE;
int result=Nodeattr.DoModal();
if(result==IDOK)
{
//如果更改了节点号,不能与某存在的节点号相同
//必须定义新的节点号
CPainted* pPainter;
if(id!=Nodeattr.m_uNodeId)
{
BOOL breturn=FALSE;
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainter =pDoc->GetShape(index);
if(pPainter->m_uStartNodeId==Nodeattr.m_uNodeId||pPainter->m_uEndNodeId==Nodeattr.m_uNodeId)
{
CString str="更改后的节点号不能与某存在的节点号相同,必须重新定义新的节点号!";
AfxMessageBox(str);
breturn=TRUE;
break;
}
}
if(breturn) {goto loop1;}
}
//节点编号更改了以后,应与m_uCurNodeIdMax
//比较,大则要更新m_uCurNodeIdMax
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainter =pDoc->GetShape(index);
if(pPainter->m_uStartNodeId==id)
{
pPainter->m_uStartNodeId=Nodeattr.m_uNodeId;
pPainter->m_fStartHeading=Nodeattr.m_fHeading;
type=0;
if(Nodeattr.m_bCheck1) type|=0x01;
if(Nodeattr.m_bCheck2) type|=0x02;
if(Nodeattr.m_bCheck3) type|=0x04;
if(Nodeattr.m_bCheck4) type|=0x08;
pPainter->m_uStartNodeType=type;
}
else if(pPainter->m_uEndNodeId==id)
{
pPainter->m_uEndNodeId=Nodeattr.m_uNodeId;
pPainter->m_fEndHeading=Nodeattr.m_fHeading;
type=0;
if(Nodeattr.m_bCheck1) type|=0x01;
if(Nodeattr.m_bCheck2) type|=0x02;
if(Nodeattr.m_bCheck3) type|=0x04;
if(Nodeattr.m_bCheck4) type|=0x08;
pPainter->m_uEndNodeType=type;
}
}
pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax
pHitNode->m_bSelectEndNode=TRUE;//TRUE表示图形元素终点被选中
UINT type1=pHitNode->m_uFigureType;
pHitNode->m_bSelect=TRUE;
BOOL bbb=pDoc->AddSelectList(type1,indexx);
pHitNode->DrawSelected(&ClientDC,this);
}
}
}
if (pHit != NULL)
{
pHit->IsDblClk(pDoc,this);
}
}
CScrollView::OnLButtonDblClk(nFlags, point);
}
BOOL CPaintobjView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
return CScrollView::PreCreateWindow(cs);
}
void CPaintobjView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
m_wscreen=cx;//客户区宽度(逻辑坐标)
m_hscreen=cy;//客户区高度(逻辑坐标)
// TODO: Add your message handler code here
/* double fbasicscale1;
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CSize siz;
pDoc->GetBounds(&siz);
m_bZoomMode = FALSE;
SetScrollSizes(MM_TEXT, siz);
fbasicscale1=(double) ((fxmax-fxmin)/(0.6*m_wscreen));
fbasicscale=(double) ((fymax-fymin)/(0.6*m_hscreen));
if(fbasicscale1>fbasicscale) fbasicscale=fbasicscale1;
m_xstart=(double) (fxmin-fbasicscale*m_wscreen*0.2);
m_ystart=(double) (fymin-fbasicscale*m_hscreen*0.2);
Invalidate();*/
}
void CPaintobjView::OnOptionSetorigin()
{
// TODO: Add your command handler code here
m_bSetorigin= TRUE;//设置原点
}
void CPaintobjView::OnOptionSetscale()
{
// TODO: Add your command handler code here
double fbasicscale1;
CSetscale setscale;
int result=setscale.DoModal();
if(result==IDOK)
{
UpdateData(true);
fbasicscale1=(double) ((setscale.m_x)/(1.0*m_wscreen));
fbasicscale=(double) ((setscale.m_y)/(1.0*m_hscreen));
if(fbasicscale1>fbasicscale) fbasicscale=fbasicscale1;
Invalidate();
}
}
BOOL CPaintobjView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CBrush* pOldBrush;
CBrush DrawBrush;
DrawBrush.CreateSolidBrush(RGB(127, 127, 127));
pOldBrush = pDC->SelectObject(&DrawBrush);
CBrush br( GetSysColor( COLOR_WINDOW ) );
FillOutsideRect(pDC, &br);
// FillOutsideRect(pDC, &DrawBrush );
pDC->SelectObject(pOldBrush);
return CScrollView::OnEraseBkgnd(pDC);
}
void CPaintobjView::OnViewRevert()
{
// TODO: Add your command handler code here
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
pDoc->m_bZoomIn= FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -