📄 paintvw.cpp
字号:
pDoc->m_bZoomOut= FALSE;
pDoc->m_nSelectedTool =ID_TOOL_SELECTOR;//使工具栏选中箭头键
pDoc->GenerateTool();
fscale=1.0f;
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
Invalidate();
}
void CPaintobjView::OnUpdateViewRevert(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
pCmdUI->Enable(pDoc->m_bZoomOut||pDoc->m_bZoomIn);
}
void CPaintobjView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{CPoint point(12,34);
// TODO: Add your message handler code here and/or call default
switch(nChar)
{
case VK_UP:
point.x=0;point.y=0;
OnMouseMove(nFlags,point) ;
break;
case VK_DOWN:
point.x=10;point.y=10;
OnMouseMove(nFlags,point) ;
break;
case VK_LEFT:
point.x=100;point.y=100;
OnMouseMove(nFlags,point) ;
break;
case VK_RIGHT:
point.x=1000;point.y=1000;
OnMouseMove(nFlags,point) ;
break;
}
CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CPaintobjView::OnEditCopy()
{
// TODO: Add your command handler code here
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(!pDoc->WriteClipBoard())//将图形写入剪裁板
{AfxMessageBox("写入剪裁板出错");
}
}
void CPaintobjView::OnUpdateEditPaste(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pCmdUI->Enable(::IsClipboardFormatAvailable(pDoc->DrawFormat));
}
void CPaintobjView::OnEditPaste()
{
// TODO: Add your command handler code here
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
SelectClear();//放弃选中的图形元素
if(pDoc->ReadClipBoard())
{
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
Invalidate();
//以下更改路径的节点编号
CPainted* pPainted;
UINT idmin,idmax;//粘贴得到的图形中节点编号的最小最大值
idmin=(UINT) (1E+15);
idmax=0;
for(int i=0;i<pDoc->m_nGraphSelect;i++)
{
UINT id1,id2;
pPainted=pDoc->GetShape(pDoc->GraphSelect[i].Index);
id1=pPainted->m_uStartNodeId;
id2=pPainted->m_uEndNodeId;
idmin=min(idmin,id1);
idmin=min(idmin,id2);
idmax=max(idmax,id1);
idmax=max(idmax,id2);
}
//
for(UINT j=idmin;j<idmax+1;j++)
{
BOOL AddFlag=FALSE;
for(int i=0;i<pDoc->m_nGraphSelect;i++)
{
UINT id1,id2;
pPainted=pDoc->GetShape(pDoc->GraphSelect[i].Index);
id1=pPainted->m_uStartNodeId;
id2=pPainted->m_uEndNodeId;
if(id1==j)
{
AddFlag=TRUE;
pPainted->m_uStartNodeId=pDoc->m_uCurNodeIdMax;
}
else if(id2==j)
{
AddFlag=TRUE;
pPainted->m_uEndNodeId=pDoc->m_uCurNodeIdMax;
}
}
//此处进行了空加!
if(AddFlag)
{
AddFlag=FALSE;
pDoc->m_uCurNodeIdMax++;
}
}
}
}
void CPaintobjView::SelectClear()//放弃选中的图形元素
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
CPainted* pPainter;
for (int index = 0; index < pDoc->m_nGraphSelect; index++)
{
pPainter =pDoc->GetShape(pDoc->GraphSelect[index].Index);
pPainter->m_bSelect=FALSE;
pPainter->DrawErase1(&ClientDC,this);
pPainter->Draw(&ClientDC);
/* UINT id1=pPainter->m_uStartNodeId;
UINT id2=pPainter->m_uEndNodeId;
CPainted* ppp;
for(int j=0;j<pDoc->NumShapes();j++)
{
ppp=pDoc->GetShape(j);
if(ppp->m_uStartNodeId==id1||ppp->m_uStartNodeId==id2
||ppp->m_uEndNodeId==id1||ppp->m_uEndNodeId==id2)
{
ppp->Draw(&ClientDC);
}
}
*/
}
pDoc->m_nGraphSelect=0;
pDoc->m_bMove= FALSE;//移动图形
pDoc->m_bMove1= FALSE;//移动图形
// Invalidate();
}
void CPaintobjView::SelectClear1()//放弃选中的图形元素
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
CPainted* pPainter;
for (int index = 0; index < pDoc->m_nGraphSelect; index++)
{
pPainter =pDoc->GetShape(pDoc->GraphSelect[index].Index);
pPainter->m_bSelect=FALSE;
pPainter->DrawErase(&ClientDC,this);
pPainter->Draw(&ClientDC);
UINT id1=pPainter->m_uStartNodeId;
UINT id2=pPainter->m_uEndNodeId;
CPainted* ppp;
for(int j=0;j<pDoc->NumShapes();j++)
{
ppp=pDoc->GetShape(j);
if(ppp->m_uStartNodeId==id1||ppp->m_uStartNodeId==id2
||ppp->m_uEndNodeId==id1||ppp->m_uEndNodeId==id2)
{
ppp->Draw(&ClientDC);
}
}
}
pDoc->m_nGraphSelect=0;
pDoc->m_bMove= FALSE;//移动图形
pDoc->m_bMove1= FALSE;//移动图形
// Invalidate();
}
//
//节点状态判断,状态0=相切点,1=非相切点,2=断点.
//
void CPaintobjView::NodeStateJudge1()//节点状态判断
{
CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPainted* pPainted;
//int (*num)[7]= new int [1000][7];//二维数组定义方式
int *num = new int[1000];//存储与某节点相连的所有线段索引值
for (UINT ii=0;ii<pDoc->m_uCurNodeIdMax;ii++)
{
int count=0;//存储与某节点相连的所有线段的数量
int nShapes = pDoc->NumShapes();
for (int index =0; index <nShapes; index++)
{
pPainted =pDoc->GetShape(index);
if(pPainted->m_uStartNodeId==ii||pPainted->m_uEndNodeId==ii)
{
if(pPainted->m_uObjectType==0)
{
num[count]=index;
count++;//存储与某节点相连的所有线段的数量
}
}
}
//只有一条线段与该节点相连,该点必为断点
if(count==1)
{
pPainted =pDoc->GetShape(num[0]);//得到第一条线段指针
if(pPainted->m_uStartNodeId==ii)
pPainted->m_uStartNodeState=2;
else if(pPainted->m_uEndNodeId==ii)
pPainted->m_uEndNodeState=2;
}
//多于一条线段与该节点相连,需判断是否全部相切
//若所有线段全部相切,则认为此节点为相切节点
//否则认为此节点为非相切节点
else if(count>1)
{
//得到第一条线段的数据,并以此线段作为
//参考与其它线段比较判断是否相切
double anglee;
pPainted=pDoc->GetShape(num[0]);
anglee=pPainted->ReturnPostureAngle(ii);
CPainted* pPainted2;
pPainted2=pDoc->GetShape(num[count-1]);
for(int counter=1;counter<count;counter++)
{
double anglee1;
pPainted=pDoc->GetShape(num[counter]);
anglee1=pPainted->ReturnPostureAngle(ii);
if(AngleJudge(anglee,anglee1))
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=0;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=0;
}
else
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=1;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=1;
break;
}
}
}
}
delete []num;
}
//
//节点状态判断,状态0=相切点,1=非相切点,2=断点.
//
void CPaintobjView::NodeStateJudge()//节点状态判断
{
/* CPaintobjDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPainted* pPainted;
//int (*num)[7]= new int [1000][7];//二维数组定义方式
int *num = new int[100];//存储与某节点相连的所有线段索引值
for (UINT ii=0;ii<pDoc->m_uCurNodeIdMax;ii++)
{
int count=0;//存储与某节点相连的所有线段的数量
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainted =pDoc->GetShape(index);
if(pPainted->m_uStartNodeId==ii||pPainted->m_uEndNodeId==ii)
{
num[count]=index;
count++;//存储与某节点相连的所有线段的数量
}
}
//只有一条线段与该节点相连,该点必为断点
if(count==1)
{
pPainted =pDoc->GetShape(num[0]);//得到第一条线段指针
if(pPainted->m_uStartNodeId==ii)
pPainted->m_uStartNodeState=2;
else if(pPainted->m_uEndNodeId==ii)
pPainted->m_uEndNodeState=2;
}
//多于一条线段与该节点相连,需判断是否全部相切
//若所有线段全部相切,则认为此节点为相切节点
//否则认为此节点为非相切节点
else if(count>1)
{ //得到第一条线段的数据,并以此线段作为
//参考与其它线段比较判断是否相切
pPainted=pDoc->GetShape(num[0]);
CPnt p1,p2;//p1存储当前节点,p2存储另一节点
UINT type1=pPainted->m_uFigureType;//type1存储路径类型line==0,arc==1
if(type1==0)//line
{
if(pPainted->m_uStartNodeId==ii)
{
p1=pPainted->returnattr1();
p2=pPainted->returnattr2();
}
else if(pPainted->m_uEndNodeId==ii)
{
p1=pPainted->returnattr2();
p2=pPainted->returnattr1();
}
}
else if(type1==1)//arc
{
if(pPainted->m_uStartNodeId==ii)
{
p1=pPainted->returnattr1();
p2=pPainted->returncirclecenter();
}
else if(pPainted->m_uEndNodeId==ii)
{
p1=pPainted->returnattr2();
p2=pPainted->returncirclecenter();
}
}
//下面循环调出与该节点相连的线段
//依次判断是否与上面给出的参考线段相切
//每次判断若相切则赋值给m_uEndNodeState及m_uStartNodeState=0
//每次判断若不相切则赋值m_uEndNodeState及m_uStartNodeState=1
//若判出一条线段不相切则可中断此次循环并断定此节点为非相切节点
for(int counter=1;counter<count;counter++)
{
CPainted* pPainted1;
pPainted1=pDoc->GetShape(num[counter]);
CPnt pp1,pp2;//pp1存储当前节点pp2存储另一节点
UINT type2=pPainted1->m_uFigureType;//type2存储路径类型
if(type2==0)//line
{
if(pPainted1->m_uStartNodeId==ii)
{
pp1=pPainted1->returnattr1();
pp2=pPainted1->returnattr2();
}
else if(pPainted1->m_uEndNodeId==ii)
{
pp1=pPainted1->returnattr2();
pp2=pPainted1->returnattr1();
}
}
else if(type2==1)//arc
{
if(pPainted1->m_uStartNodeId==ii)
{
pp1=pPainted1->returnattr1();
pp2=pPainted1->returncirclecenter();
}
else if(pPainted1->m_uEndNodeId==ii)
{
pp1=pPainted1->returnattr2();
pp2=pPainted1->returncirclecenter();
}
}
CPainted* pPainted2;
pPainted2=pDoc->GetShape(num[count-1]);
if(type1==0)//若参考线段为直线
{
if(type2==0)//若相连线段为直线
{
double bb;
bb=PointToLine1(pp2,p1,p1,p2,FALSE);
if(bb<0.001)//相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=0;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=0;
}
else//不相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=1;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=1;
break;
}
}
else//若相连线段为圆弧
{
double bb;
bb=PointToLine1(p2,pp1,pp1,pp2,TRUE);
if(bb<0.001)//相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=0;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=0;
}
else//不相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=1;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=1;
break;
}
}
}
else if(type1==1)//若参考线段为圆弧
{
if(type2==0)//若相连线段为直线
{
double bb;
bb=PointToLine1(pp2,p1,p1,p2,TRUE);
if(bb<0.001)//相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartNodeState=0;
else if(pPainted2->m_uEndNodeId==ii)
pPainted2->m_uEndNodeState=0;
}
else//不相切
{
if(pPainted2->m_uStartNodeId==ii)
pPainted2->m_uStartN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -