drawview.cpp
来自「VC做的矢量画图程序!」· C++ 代码 · 共 2,000 行 · 第 1/5 页
CPP
2,000 行
}
//“粘贴"菜单项的对应函数,用来插入剪裁板中的图形元素到图形中
void CDrawView::OnEditPaste()
{
DispStatus("请用鼠标点中粘贴的插入顶点");
m_DrawCurrent=20;
PushNumb=0;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}
//“Copy"菜单项的对应函数,用来将选中的图形放在剪裁板
void CDrawView::OnEditCopy()
{
CDrawDoc* pDoc = GetDocument();
short nGraphCut;
nGraphCut=0;
for(int i=0;i<pDoc->n_GraphSelect;i++)
{
if(pDoc->GraphSelect[i].Lb<=5) //如果是直线、圆、圆形区域、连续直线和标注文本等5种图形元素
pDoc->GraphSelect[nGraphCut++]=pDoc->GraphSelect[i];
}
pDoc->n_GraphSelect=nGraphCut;
if(pDoc->WriteClipBoard()) //将图形写入剪裁板
DispStatus("操作成功,请选择操作菜单");
}
//“恢复"菜单项的对应函数,用来实现完全的逆操作
void CDrawView::OnEditUndo()
{
CDrawDoc* pDoc = GetDocument();
pDoc->n_GraphSelect=0;
CClientDC ht(this);
pDoc->OnEditUndo(); //进行一步逆操作
pDoc->UpdateAllViews(this); //重画所有视图
}
//“图形重画”菜单项的映射函数
void CDrawView::OnGraphRedraw()
{
CDrawDoc* pDoc = GetDocument(); //得到文档的指针
Invalidate();
pDoc->UpdateAllViews(this);
}
//“图形放大”菜单项的映射函数
void CDrawView::OnGraphZoomOut()
{
DispStatus("请用鼠标选择放大窗口的一个顶点");
m_DrawCurrent=11; //标识进行图形放大操作
PushNumb=0;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurZoomOut);
}
//“图形移动”菜单项的对应函数
void CDrawView::OnGraphPan()
{
DispStatus("请用鼠标选择移动的基点");
m_DrawCurrent=12; //标识进行图形移动操作
PushNumb=0;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurHand);
}
//“重画上屏”菜单项的对应函数
void CDrawView::OnGraphUp()
{
CDrawDoc* pDoc = GetDocument();
if(pDoc->m_CurrentScreen>pDoc->m_CurrentScreen1) //如果不是第一屏
pDoc->m_CurrentScreen--;
//得到上一屏的图形参数并重画
m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
blc=p_Screen[pDoc->m_CurrentScreen].blc;
// InitVScroll();
// InitHScroll();
Invalidate();
}
//“重画首屏”菜单项的对应函数
void CDrawView::OnGraphFirst()
{
CDrawDoc* pDoc = GetDocument();
m_xStart=p_Screen[pDoc->m_CurrentScreen1].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen1].sy;
blc=p_Screen[pDoc->m_CurrentScreen1].blc;
pDoc->AddScreen(m_xStart,m_yStart,blc);
// InitVScroll();
// InitHScroll();
Invalidate();
}
//“重画全屏”菜单项的对应函数
void CDrawView::OnGraphAll()
{
float minx,miny,maxx,maxy,bl1;
CDrawDoc* pDoc = GetDocument();
//捕捉光标,并使光标成沙漏等待光标
//把最小值给非常大,把最大值给非常小,为了对变量进行初试化
minx=(float)1E+20;miny=(float)1E+20;maxx=(float)-1E+20;maxy=(float)-1E+20;
SetCapture();
SetCursor(LoadCursor(NULL,IDC_WAIT));
BOOL pb=pDoc->GetRect(&minx,&miny,&maxx,&maxy);
//将光标变为箭头形,放弃捕捉的光标
SetCursor(LoadCursor(NULL,IDC_ARROW));
ReleaseCapture();
if(!pb) //没有图形元素
{
m_xStart=51081;
m_yStart=92800;
blc=2.0;
return;
}
else
{
bl1=(maxx-minx)/(m_wScreen-20); //横向比例
blc=(maxy-miny)/(m_hScreen-20); //纵向比例
if(bl1>blc)
blc=bl1; //取较大的一个作为比例尺
/*以下确定屏幕左下角的实际坐标,即在左侧和下侧都留了10点阵的区域
(minx,miny)在屏幕的左下角向右10点阵同时向上10点阵处。*/
m_xStart=minx-10*blc;
m_yStart=miny-10*blc;
}
//将全图的显示比例放在首屏,并把屏幕设为首屏
p_Screen[pDoc->m_CurrentScreen1].sx=m_xStart;
p_Screen[pDoc->m_CurrentScreen1].sy=m_yStart;
p_Screen[pDoc->m_CurrentScreen1].blc=blc;
pDoc->m_CurrentScreen=pDoc->m_CurrentScreen1;
// InitVScroll();
// InitHScroll();
Invalidate();
}
//“鼠标选中”菜单项的对应函数
void CDrawView::OnSelectMouse()
{
DispStatus("请用鼠标点中需选择的图形元素");
m_DrawCurrent=30; //标识进行图形选中操作
PushNumb=0;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}
//“图形数据修改”菜单项的对应函数
void CDrawView::OnGreaphModify()
{
DispStatus("请用鼠标点中需修改图形数据的图形元素");
m_DrawCurrent=33; //标识进行图形选中操作
PushNumb=0;
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}
//“放弃选中”菜单项的对应函数,用来放弃所作的选择
void CDrawView::OnSelectClear()
{
CDrawDoc* pDoc = GetDocument();
CClientDC ht(this);
//for(int i=0;i<pDoc->n_GraphSelect;i++) //将选中的图形元素原样进行绘制
// pDoc->DrawGraph(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].Index,0,0,m_bColor);
Invalidate();
pDoc->n_GraphSelect=0;
if(pDoc->b_IsOleSelect)
{
POSITION pos=pDoc->GetStartPosition();
while(pos!=NULL)
{
CDrawCntrItem *pItem=(CDrawCntrItem *)pDoc->GetNextClientItem(pos);
if(pItem!=NULL)
pItem->b_Select=FALSE;
}
pDoc->b_IsOleSelect=0;
Invalidate();
}
}
//设置图形的线型及颜色参数,“线型及颜色设置”菜单项的消息处理函数
void CDrawView::OnGraphParaSET()
{
XxColorSetDialog pDg1(m_pColor,m_bColor,m_brColor,m_beColor,m_LineType,m_LineWide);
if(pDg1.DoModal()==IDOK)
{
m_pColor=pDg1.m_color1;
m_bColor=pDg1.m_color2;
m_brColor=pDg1.m_color3;
m_beColor=pDg1.m_color4;
m_LineWide=pDg1.m_linewide;
m_LineType=pDg1.m_linetype;
Invalidate();
}
}
//图层管理函数,“分层管理”菜单项的消息处理函数
void CDrawView::OnLayerManage()
{
LayerSetDialog pDlg1(p_GraphPara->m_LayerList,p_GraphPara->n_LayerNumb,m_Layer);
if(pDlg1.DoModal()==IDOK)
{
p_GraphPara->n_LayerNumb=pDlg1.m_nLayerNumb;
m_Layer=pDlg1.m_LayerIndex;
Invalidate();
}
}
//选择的图形元素创建图形块的消息处理函数
void CDrawView::OnBlockAdd()
{
PushNumb=0;
m_DrawCurrent=40; //选择的图形元素形成一个新图形块
DispStatus("请用鼠标选择图例的插入点");
}
//开始创建新图形块,“制作新图形块”菜单项的消息处理函数
void CDrawView::OnBlockNew()
{
CDrawDoc* pDoc = GetDocument();
m_DrawCurrent=0;
pDoc->ClearDraw();
m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
blc=p_Screen[pDoc->m_CurrentScreen].blc;
pDoc->m_DrawEdit=1;
if(m_DrawCurrent==8)
m_DrawCurrent=0;
DispStatus("请选择操作菜单");
// InitVScroll();
// InitHScroll();
Invalidate();
}
//保存编辑的图形块退出图形块编辑状态的消息处理函数
void CDrawView::OnEditBlockOk()
{
CDrawDoc* pDoc = GetDocument();
pDoc->OnEditBlockOk();
m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
blc=p_Screen[pDoc->m_CurrentScreen].blc;
// InitVScroll();
// InitHScroll();
m_DrawCurrent=0;
DispStatus("请选择操作菜单");
Invalidate();
}
//放弃编辑的图形块退出图形块编辑状态的消息处理函数
void CDrawView::OnEditBlockCancel()
{
CDrawDoc* pDoc = GetDocument();
pDoc->OnEditBlockCancel();
// InitVScroll();
// InitHScroll();
m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
blc=p_Screen[pDoc->m_CurrentScreen].blc;
m_DrawCurrent=0;
DispStatus("请选择操作菜单");
Invalidate();
}
//绘制图形块插入点的消息处理函数
void CDrawView::OnBlockInsert()
{
PushNumb=0;
m_DrawCurrent=41; //绘制插入图形块的插入点
DispStatus("请用鼠标点中图例的插入点");
::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}
//调用图形块管理对话框管理图形块,“图形块管理”菜单项的消息处理函数
void CDrawView::OnBlockDialog()
{
CDrawDoc* pDoc = GetDocument();
int nn=pDoc->OnBlockDialog();
if(nn==2) //增加新图形块
{
m_DrawCurrent=0;
Invalidate();
}
else if(nn==3) //修改既有图形块
{
m_DrawCurrent=0;
//OnGraphAll();
}
if(nn==2||nn==3)
{
m_DrawCurrent=0;
m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
blc=p_Screen[pDoc->m_CurrentScreen].blc;
DispStatus("请选择操作菜单");
// InitVScroll();
// InitHScroll();
Invalidate();
}
}
//图象底图管理,“图象底图管理”菜单项的消息处理函数
void CDrawView::OnBasemapManage()
{
CDrawDoc* pDoc = GetDocument();
CBasemapDlg pdlg1(pDoc);
if(pdlg1.DoModal()==IDOK)
Invalidate();
}
//按下鼠标左键时被调用,ON_WM_LBUTTONDOWN消息的映射函数
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
BOOL bSelect;
float r;
float xx1,yy1,xx2,yy2;
int x1,x2,y1,y2,Lb,Index,pbh,id;
BOOL m_Fill;
CDrawDoc* pDoc = GetDocument(); //得到文档指针
CClientDC ht(this);
if(m_DrawCurrent==1) //如果正在绘制直线
{
if(PushNumb==0) //如果是第一次按下左鼠标键
{
PushNumb++; //做标记表示按下鼠标左键一次
mPointOrign=point; //直线的第一点等于点中点
mPointOld=point; //记录本次点中点
SetCapture(); //捕捉鼠标输入
DispStatus("请用鼠标点中直线的结束点");
}
else if(PushNumb==1) //第二次按下左鼠标键(即按下直线的结束点时)
{
//以下得到直线起终点的实际坐标
VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
VPtoDP(point.x,point.y,&xx2,&yy2);
//增加一条直线并重新绘画此直线
if(pDoc->m_DrawEdit==0)
id=pDoc->GetGraphID(1);
else
id=0;
pDoc->AddLine(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
xx1,yy1,xx2,yy2)
->Draw(&ht,0,0,m_bColor);
PushNumb=0; //鼠标按键次数为0,重新进行直线的绘制
//以下是记录增加直线这一操作,供逆操作时用
GraphUndo[0].Index=pDoc->GetGraphUpperBound(1);//得到此直线的序号
GraphUndo[0].Lb=1; //直线
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
DispStatus("请用鼠标点中直线的起始点");
}
}
else if(m_DrawCurrent==2||m_DrawCurrent==3||m_DrawCurrent>=81&&m_DrawCurrent<=84)//正在绘制连续直线或者多边形区域
{
//将点的坐标存入Pointxy中
PointXyz[PushNumb].x=m_xStart+blc*point.x;
PointXyz[PushNumb].y=m_yStart+blc*(m_hScreen-point.y);
PointXyz[PushNumb].z=0;
if(PushNumb==0) //如果是第一次按下左鼠标键
{
SetCapture(); //捕捉鼠标
mPointOrign1=point;//第一个顶点为点中点
mPointOrign=point;//原点等于点中点
mPointOld=point; //将前一个点设为点中点的坐标
}
else //二次以上按下鼠标左键时
{
mPointOrign=mPointOld; //将上一个点设为原点
mPointOld=point; //将点中点设为原点
}
PushNumb++; //记录按下点的数目
}
else if(m_DrawCurrent==300)//正在绘制连续直线或者多边形区域
{
//将点的坐标存入Pointxy中
PointPL[PushNumb].x=m_xStart+blc*point.x;
PointPL[PushNumb].y=m_yStart+blc*(m_hScreen-point.y);
PointPL[PushNumb].z=0;
if(PushNumb==0) //如果是第一次按下左鼠标键
{
SetCapture(); //捕捉鼠标
mPointOrign1=point;//第一个顶点为点中点
mPointOrign=point;//原点等于点中点
mPointOld=point; //将前一个点设为点中点的坐标
}
else //二次以上按下鼠标左键时
{
mPointOrign=mPointOld; //将上一个点设为原点
mPointOld=point; //将点中点设为原点
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?