📄 paintvw.cpp
字号:
pDoc->PointXY[m_npushnumber].y=pnt.y;
if(m_npushnumber==0)
{
SetCapture();
pDoc->m_pSelectedTool->OnDown(pnt);
}
else
{
pDoc->m_pSelectedTool->m_pointPrimary=((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pointEnd;
((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pointEnd=pnt;
}
m_npushnumber++;
pDoc->m_nCount=m_npushnumber;
}
else////给定所有顶点画法
{m_bTracking = TRUE;
}
}
else if(pDoc->m_bpaintRect) //TRUE表示正在画矩形
{
SetCapture();
m_bTracking = TRUE;
CPnt pnt2;
((CPaintRect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintRect*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintRoundrect)//TRUE表示正在画圆角矩形
{
SetCapture();
m_bTracking = TRUE;
CPnt pnt2;
((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
((CPaintRoundrect*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_ellwidth=pnt2.x;
((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_ellheight=pnt2.y;
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintScp)//TRUE表示正在画软侧移
{
SetCapture();
m_bTracking = TRUE;
CPnt pntt;
double angle=0;
UINT id;
if(pDoc->m_ScpPaintMode==1||pDoc->m_ScpPaintMode==2)//路径的绘制模式
{
pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
}
((CPaintScp*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
BOOL yy=((CPaintScp*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
if(yy==FALSE)//return FALSE表示无就近点
{
pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
}
else //return TRUE表示有就近点
{
pDoc->m_uCurStartnodeId=id;
pDoc->m_pSelectedTool->m_uStartNodeId=id;
pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
pnt=pntt;
}
if(pDoc->m_bGetangleMode)//FALSE表示自动取角
{
((CPaintScp*) pDoc->m_pSelectedTool)->m_angStart=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
}
else
{
((CPaintScp*) pDoc->m_pSelectedTool)->m_angStart=angle;// 起点的倾斜角(世界坐标系中)
}
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(pDoc->m_bpaintSide)//TRUE表示正在画硬侧移
{
SetCapture();
m_bTracking = TRUE;
CPnt pntt;
double angle=0;
UINT id;
if(pDoc->m_SidePaintMode==1||pDoc->m_SidePaintMode==2)//路径的绘制模式
{
pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
}
((CPaintSide*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
BOOL yy=((CPaintSide*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
if(yy==FALSE)//return FALSE表示无就近点
{
pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
}
else //return TRUE表示有就近点
{
pDoc->m_uCurStartnodeId=id;
pDoc->m_pSelectedTool->m_uStartNodeId=id;
pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
pnt=pntt;
}
if(pDoc->m_bGetangleMode)//FALSE表示自动取角
{
((CPaintSide*) pDoc->m_pSelectedTool)->m_angHeading=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
}
else
{
((CPaintSide*) pDoc->m_pSelectedTool)->m_angHeading=angle;// 起点的倾斜角(世界坐标系中)
}
pDoc->m_pSelectedTool->OnDown(pnt);
}
else if(m_bSetorigin)
{
m_bSetorigin= FALSE;//设置原点
CPainted* pPainter;
CPnt pointEnd;
CPnt pointPrimary;
CPoint pointEnd1;
CPoint pointPrimary1;
CPoint point1;
DPtoVP(pnt,point1);
int nShapes = pDoc->NumShapes();
for (int index = 0; index < nShapes; index++)
{
pPainter =pDoc->GetShape(index);
pointPrimary=pPainter->returnattr1();
pointEnd=pPainter->returnattr2();
DPtoVP(pointPrimary,pointPrimary1);
DPtoVP(pointEnd,pointEnd1);
if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
{ pnt.x=pointPrimary.x;
pnt.y=pointPrimary.y;
break;
}
else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
{ pnt.x=pointEnd.x;
pnt.y=pointEnd.y;
break;
}
}
int nShapes1 = pDoc->NumShapes();
for (int index1 = 0; index1 < nShapes1; index1++)
{
pPainter =pDoc->GetShape(index1);
pPainter->ChangeOrigin(pnt);//
}
CRect rect;
pDoc->ExpandBounds(&rect);
m_xstart-=pnt.x;
m_ystart-=pnt.y;
CSize siz;
pDoc->GetBounds(&siz);
}
else if(pDoc->m_bZoomIn)
{ ::SetCursor(m_hcurZoomin);
if(fscale>=0.1)
{
fscale-=fscale*0.2;
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
Invalidate();
CPoint PP;
DPtoVP(pnt,PP);//把最终实际坐标变换为逻辑坐标
CPoint point1(PP.x-m_wscreen/2,PP.y-m_hscreen/2);
ScrollToPosition(point1);
}
}
else if(pDoc->m_bZoomOut)
{ ::SetCursor(m_hcurZoomout);
if(fscale<=5)
{
fscale+=1;
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
Invalidate();
CPoint PP;
DPtoVP(pnt,PP);//把最终实际坐标变换为逻辑坐标
CPoint point1(PP.x-m_wscreen/2,PP.y-m_hscreen/2);
ScrollToPosition(point1);
}
}
else if(pDoc->m_bMove)//移动图形
{ pDoc->m_bMove1=TRUE;
pDoc->m_pStartMove=pnt;//移动图形的起点
//以下循环声明是首次移动,目的是不擦除原图形
for(int i=0;i<pDoc->m_nGraphSelect;i++)
{
CPainted* pPainted;
pPainted =pDoc->GetShape(pDoc->GraphSelect[i].Index);
pPainted->m_bFirstMove=TRUE;
}
}
//点击某直线自动取其角度值给对话条的角度编辑框
else if(pDoc->m_banglelengthok)
{
//得到主框架对象的指针
CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CPainted* pPainted;
UINT nShapes = pDoc->NumShapes();
for (UINT index = 0; index < nShapes; index++)
{
pPainted = pDoc->GetShape(index);
if(pPainted->m_uFigureType==0)
{
if (pPainted->IsHit(pnt))
{
double angle;
angle=((CPaintLine*) pPainted)->m_fangle;
angle=angle*180.0/pi;
//pDoc->m_fangle=angle;
CString str;
str.Format("%.4f",angle);
p_Wnd->m_wndMyDialogBar1.SetDlgItemText(IDC_ANGLE,str);
OnChangeAngle();
break;
}
}
}
}
//选中多个图形元素
else if(nFlags==(MK_SHIFT|MK_LBUTTON))//
{
CPainted* pPainted;
UINT type1,index1;
UINT nShapes = pDoc->NumShapes();
for (UINT index = 0; index < nShapes; index++)
{
pPainted = pDoc->GetShape(index);
if (pPainted->IsHit(pnt))
{ type1=pPainted->m_uFigureType;
index1=index;
pPainted->m_bSelect=TRUE;
BOOL bbb=pDoc->AddSelectList(type1,index);
if(bbb)
pPainted->DrawSelected(&ClientDC,this);
break;
}
}
}
//更改参考线段的参考节点,选中图形元素
else if(pDoc->m_nGraphSelect||nFlags==MK_LBUTTON)//此项应排在最后以免影响其他事件的响应
{
if(pDoc->m_nGraphSelect)
{
CPainted* pPainted;
UINT bIsHit1=0;
for (int index = 0; index < pDoc->m_nGraphSelect; index++)
{
pPainted =pDoc->GetShape(pDoc->GraphSelect[index].Index);
bIsHit1=pPainted->IsHit1(pnt);
if(bIsHit1)
{
pPainted->m_bReferencePoint=!pPainted->m_bReferencePoint;
pPainted->DrawSelected(&ClientDC,this);
break;
}
}
if(!bIsHit1)
{
UINT type1,index1;
UINT nShapes = pDoc->NumShapes();
for (UINT index2 = 0; index2 < nShapes; index2++)
{
pPainted = pDoc->GetShape(index2);
if (pPainted->IsHit(pnt))
{
SelectClear();//放弃选中的图形元素
type1=pPainted->m_uFigureType;
index1=index2;
pPainted->m_bSelect=TRUE;
BOOL bbb=pDoc->AddSelectList(type1,index2);
if(bbb)
pPainted->DrawSelected(&ClientDC,this);
break;
}
}
}
//
}
else
{
CPainted* pPainted;
UINT type1,index1;
UINT nShapes = pDoc->NumShapes();
for (UINT index = 0; index < nShapes; index++)
{
pPainted = pDoc->GetShape(index);
if (pPainted->IsHit(pnt))
{ type1=pPainted->m_uFigureType;
index1=index;
pPainted->m_bSelect=TRUE;
BOOL bbb=pDoc->AddSelectList(type1,index);
if(bbb)
pPainted->DrawSelected(&ClientDC,this);
break;
}
}
}
}
CScrollView::OnLButtonDown(nFlags, point);
}
void CPaintobjView::OnLButtonUp(UINT nFlags, CPoint point)
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
CPnt pnt;
VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标
if(pDoc->m_bZoomIn)
{
::SetCursor(m_hcurZoomin);
}
if(pDoc->m_bZoomOut)
{
::SetCursor(m_hcurZoomout);
}
if(pDoc->m_bMove)
{
::SetCursor(m_hcurMove);
}
if(pDoc->m_bMove1)
{
pDoc->m_bMove1=FALSE;
CRect rect;
pDoc->ExpandBounds(&rect);
CSize siz;
pDoc->GetBounds(&siz);
SetScrollSizes(MM_TEXT, siz);
Invalidate();
}
if (m_bTracking && pDoc->m_bpaintPolygon==FALSE)
{
if(pDoc->m_bpaintLine&&pDoc->m_banglelengthok)//定角定长画线
{
pDoc->m_banglelengthok=FALSE;
CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CButton* bu=(CButton*)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_CHECKED));
bu->SetCheck(0);
}
UINT type1,index1;
m_npushnumber=0;//左键抬起,按下左键次数清零
ASSERT(pDoc->m_pSelectedTool != NULL);
pDoc->m_Objects.Add(pDoc->m_pSelectedTool);
SelectClear();//放弃选中的图形元素
Invalidate();
pDoc->m_pSelectedTool->m_bSelect=TRUE;
if(pDoc->m_pSelectedTool->m_uObjectType==0 && (pDoc->m_bpaintarc||pDoc->m_bpaintLine||pDoc->m_bpaintLazys||pDoc->m_bpaintSide||pDoc->m_bpaintScp))
{
pDoc->NoPaint();
//新画一条线段其路径ID必然递增
pDoc->m_pSelectedTool->m_uPathId=pDoc->m_uCurPathIdMax;
pDoc->m_uCurPathIdMax++;
if(pDoc->m_bStartnodeIndep)//线段起点独立
{
pDoc->m_pSelectedTool->m_uStartNodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_uCurNodeIdMax++;
}
else//线段起点不独立
{
pDoc->m_bStartnodeIndep=TRUE;
pDoc->m_pSelectedTool->m_uStartNodeId=pDoc->m_uCurStartnodeId;
}
if(pDoc->m_bEndnodeIndep)//线段终点独立
{
pDoc->m_pSelectedTool->m_uEndNodeId=pDoc->m_uCurNodeIdMax;
pDoc->m_uCurNodeIdMax++;
}
else//线段终点不独立
{
pDoc->m_bEndnodeIndep=TRUE;
pDoc->m_pSelectedTool->m_uEndNodeId=pDoc->m_uCurEndnodeId;
}
//pDoc->m_pSelectedTool->GetPostureAngle();//计算得到路段的姿态角(外射角)
}
pDoc->m_pSelectedTool->GetPostureAngle();//计算得到路段的姿态角(外射角)
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);
pDoc->m_pSelectedTool->Normalize();
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();
}
CScrollView::OnLButtonUp(nFlags, point);
}
void CPaintobjView::OnMouseMove(UINT nFlags, CPoint point)
{
CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
ASSERT(pDoc != NULL);
CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
CClientDC ClientDC(this);
OnPrepareDC(&ClientDC);
ClientDC.DPtoLP(&point);
CPnt pnt;
VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标
CMainFrame* pMain = (CMainFrame*) AfxGetApp()->m_pMainWnd;
CString strPosition;
strPosition.Format(_T("X=%.4fm,Y=%.4fm"), pnt.x, pnt.y);
pMain->m_wndStatusBar.SetPaneText(1, strPosition);
if (pDoc->m_pSelectedTool == NULL)
{
if(m_bSetorigin)
{
::SetCursor(m_hcurSetorigin);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -