drawview.cpp
来自「VC做的矢量画图程序!」· C++ 代码 · 共 2,000 行 · 第 1/5 页
CPP
2,000 行
PushNumb++; //记录按下点的数目
}
else if(m_DrawCurrent==4||m_DrawCurrent==5) //如果正在绘制普通圆或者填充圆
{
if(PushNumb==0) //如果是第一次按下左鼠标键
{
mPointOrign=point; //原点等于点中点
mPointOld=point; //上一个点也等于点中点
PushNumb++;
SetCapture(); //捕捉鼠标
DispStatus("请用鼠标点中圆的一个点");
}
else //二次以上按下鼠标左键时
{
PushNumb=0; //鼠标按键次数为0,重新进行直线的绘制
//保存圆或填充圆
x1=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2));
r=VLtoDL(x1);
VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
if(m_DrawCurrent==4) //如果是绘制一般圆
m_Fill=0;
else
m_Fill=1;
//保存圆并以覆盖模式重画圆
if(pDoc->m_DrawEdit==0)
id=pDoc->GetGraphID(3);
else
id=0;
pDoc->AddCircle(m_pColor,m_brColor,m_LineWide,m_LineType,
m_Layer,id,xx1,yy1,r,m_Fill)
->Draw(&ht,0,0,m_bColor);
ReleaseCapture(); //释放捕捉的鼠标
//以下是记录增加圆这一操作,供逆操作时用
GraphUndo[0].Index=pDoc->GetGraphUpperBound(3); //此圆的序号
GraphUndo[0].Lb=3; //类别是圆
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
DispStatus("请用鼠标点中圆的圆心");
}
}
else if(m_DrawCurrent>=71&&m_DrawCurrent<=74) //如果正在用圆来选择图形
{
bSelect=0;
if(PushNumb==0) //如果是第一次按下左鼠标键
{
mPointOrign=point; //原点等于点中点
mPointOld=point; //上一个点也等于点中点
PushNumb++;
SetCapture(); //捕捉鼠标
DispStatus("请用鼠标点中圆的一个点");
}
else //二次以上按下鼠标左键时
{
PushNumb=0; //鼠标按键次数为0,重新进行直线的绘制
//保存圆或填充圆
x1=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2));
r=VLtoDL(x1);
VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
m_pArc=new CArc(1,0,1,0,0,0,0,xx1,yy1,r,1,0,(float)pi*2);
CDraw* pDraw;
if(m_DrawCurrent==74)//如果是数据操作
{
pDoc->n_GraphSelect=0;
for(int i=1;i<=2;i++) //对2类图形元素循环
{
int nn=pDoc->GetGraphUpperBound(i)+1; //得到图形元素的数目
while(nn-->pDoc->GraphNumbStart[i-1])
{
pDraw=pDoc->GetGraph(i,nn);
if(pTree->m_PlSelType==1)
{
if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==1)
{
bSelect=1;
pDoc->AddSelectList(i,nn,pDraw->GetID());
}
}
if(pTree->m_PlSelType==2)
{
if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==2)
{
bSelect=1;
pDoc->AddSelectList(i,nn,pDraw->GetID());
}
}
if(pTree->m_PlSelType==3)
{
if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==3)
{
bSelect=1;
pDoc->AddSelectList(i,nn,pDraw->GetID());
}
}
}
}
pTree->ShowSelData();
}
else
for(int i=1;i<=7;i++) //对7类图形元素循环
{
int nn=pDoc->GetGraphUpperBound(i)+1; //得到图形元素的数目
while(nn-->pDoc->GraphNumbStart[i-1])
{
pDraw=pDoc->GetGraph(i,nn);
if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-70,xx1-r,yy1-r,xx1+r,yy1+r,blc))
{
bSelect=1;
pDoc->AddSelectList(i,nn,pDraw->GetID());
}
}
}
delete m_pArc;
PushNumb=0;
DispStatus("请用鼠标点中圆的圆心");
ReleaseCapture(); //释放捕捉的鼠标
//if(bSelect)
Invalidate();
}
}
else if(m_DrawCurrent==6)//正在绘制圆弧
{
if(PushNumb==0) //第一次按下鼠标左键
{
SetCapture();
DrawArcYes=0;
mPointOrign1=point; //记录圆弧第一点
PushNumb++;
DispStatus("请用鼠标点中圆弧的第二点");
}
else if(PushNumb==1) //第二次按下鼠标左键
{
mPointOrign=point; //记录下圆弧的第二点
PushNumb++;
DispStatus("请用鼠标点中圆弧的第三点");
}
else //第三次按下鼠标键
{
//计算圆弧的特征参数
jsarc(mPointOrign1,mPointOrign,point,&m_CircleX,&m_CircleY,
&m_CircleR,&m_Angle1,&m_Angle2);
//增加一个圆弧并重新绘制圆弧
if(pDoc->m_DrawEdit==0)
id=pDoc->GetGraphID(4);
else
id=0;
pDoc->AddArc(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
m_CircleX,m_CircleY,m_CircleR,0,m_Angle1,m_Angle2)
->Draw(&ht,0,0,m_bColor);
PushNumb=0; ////鼠标按键次数为0,重新进行圆弧的绘制
ReleaseCapture(); //释放捕捉的鼠标
//以下是记录增加圆弧这一操作,供逆操作时用
GraphUndo[0].Index=pDoc->GetGraphUpperBound(4); //此圆弧的序号
GraphUndo[0].Lb=4; //类别是圆弧
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture();
DispStatus("请用鼠标点中圆弧的起始点");
}
}
else if(m_DrawCurrent==7) //进行标注文字的操作
{
VPtoDP(point.x,point.y,&m_TextX,&m_TextY);
if(!pTextDlg) //如果标注文字对话框不存在,产生对话框
{
//初始画形成一个标注文字对话框
pTextDlg=new TextWriteDlg(this,m_TextString,m_FontHeight,m_FontWide,
m_TextAngle,m_FontAngle,m_FontBetween);
ASSERT(pTextDlg);
}
if(!(pTextDlg->m_hWnd)) //如果对话框没有打开
{
pTextDlg->Create(ID_WRITE_TEXT,this);
}
if(!(pTextDlg->IsVisible()))//如果对话框当前不可见
{
pTextDlg->ShowWindow(SW_SHOW); //使标注文字对话框可见
}
}
else if(m_DrawCurrent==8) //正在绘制图例
{
if(PushNumb==0)
{
mPointOrign=point;
mPointOld=point;
PushNumb++;
DispStatus("请用鼠标点中图例高度的结束点");
}
else if(PushNumb==1) //第二次按下左键
{
ht.SetROP2(R2_NOT);
ht.MoveTo(mPointOrign);
ht.LineTo(mPointOld);
xx1=VLtoDL(mPointOrign.y-point.y);
y_Scale=xx1/pBlock->GetHeight();
if(y_Scale<0)
y_Scale=-y_Scale;
x_Scale=y_Scale;
VPtoDP(point.x,point.y,&xx1,&yy1);
pBlock->Draw(&ht,xx1,yy1,x_Scale,y_Scale,1,0);
PushNumb++;
DispStatus("请用鼠标点中图例的插入点");
}
else if(PushNumb==2) //第三次按下鼠标左键
{
VPtoDP(point.x,point.y,&xx1,&yy1);
if(pDoc->m_DrawEdit==0)
id=pDoc->GetGraphID(6);
else
id=0;
pDoc->AddTag(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,xx1,yy1,x_Scale,y_Scale,id,pBlock)
->Draw(&ht,0,0,0);
PushNumb=0; //完成操作,左键按下数置0
GraphUndo[0].Index=pDoc->GetGraphUpperBound(6); //此圆弧的序号
GraphUndo[0].Lb=6; //类别是圆弧
pDoc->AddUndo(2,1,GraphUndo);
ReleaseCapture(); //释放捕捉的鼠标
DispStatus("请用鼠标点中图例高度的起点");
}
}
else if(m_DrawCurrent==12)//图形移动
{
if(PushNumb==0)
{
DispStatus("请用鼠标拖动至移动的结束点");
mPointOrign=point; //原点等于点中点
mPointOld=point; //上一个点等于点中点
SetCapture();
}
/* else if(PushNumb==1)
{
m_xStart=m_xStart-blc*(point.x-mPointOrign.x);
m_yStart=m_yStart-blc*(point.y-mPointOrign.y);
}*/
}
else if(m_DrawCurrent==11||m_DrawCurrent==50) //正在进行图形放大
{
if(PushNumb==0) //如果第一次按下鼠标左键
{
if(m_DrawCurrent==11)
DispStatus("请用鼠标点中放大窗口的另一顶点");
else if(m_DrawCurrent==50)
DispStatus("请用鼠标点中对象插入区域的另一顶点");
mPointOrign=point; //原点等于点中点
mPointOld=point; //上一个点等于点中点
PushNumb++; //按键数增加1
SetCapture(); //捕捉鼠标
}
else if(PushNumb==1)//第二次按下左键
{
if(m_DrawCurrent==11) //图形放大
{
//得到左下点和右上点
x1=min(mPointOrign.x,point.x);
y1=max(mPointOrign.y,point.y);
x2=max(mPointOrign.x,point.x);
y2=min(mPointOrign.y,point.y);
//改变原点的坐标
VPtoDP(x1,y1,&m_xStart,&m_yStart);
//改变比例
float bl1=(float)m_wScreen/(float)(x2-x1); //横向放大比例
float bl2=(float)m_hScreen/(float)(y1-y2); //纵向放大比例
if(bl2<bl1)
bl1=bl2; //取较小的变化比例
if(bl1>0)
blc=blc/bl1; //改变显示比例
pDoc->AddScreen(m_xStart,m_yStart,blc); //保存本屏的参数
// InitVScroll();
// InitHScroll();
Invalidate(); //使图形重画
}
else if(m_DrawCurrent==50) //如果是插入OLE对象操作
{
//得到左下点和右上点
x1=min(mPointOrign.x,point.x);
y1=max(mPointOrign.y,point.y);
x2=max(mPointOrign.x,point.x);
y2=min(mPointOrign.y,point.y);
COleInsertDialog dlg;
if (dlg.DoModal() != IDOK)
return;
BeginWaitCursor();
CDrawCntrItem* pItem = NULL;
TRY
{
pItem = new CDrawCntrItem(pDoc);
ASSERT_VALID(pItem);
if (!dlg.CreateItem(pItem))
AfxThrowMemoryException(); // any exception will do
ASSERT_VALID(pItem);
if (dlg.GetSelectionType()==COleInsertDialog::createNewItem)
pItem->DoVerb(OLEIVERB_SHOW, this);
ASSERT_VALID(pItem);
m_pSelection = pItem; // set selection to last inserted item
VPtoDP(x1,y1,&pItem->m_X1,&pItem->m_Y1);
VPtoDP(x2,y2,&pItem->m_X2,&pItem->m_Y2);
pDoc->UpdateAllViews(NULL);
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor();
}
if(m_DrawCurrent==11)
DispStatus("请用鼠标点中放大窗口的一个顶点");
else if(m_DrawCurrent==12)
DispStatus("请用鼠标点中移动的基点");
else if(m_DrawCurrent==50)
{
DispStatus("请选择操作菜单");
m_DrawCurrent=0; //完成一次后,不继续运行此功能
}
PushNumb=0; //完成操作,左键按下数置0
ReleaseCapture(); //释放捕捉的鼠标
}
}
else if(m_DrawCurrent==13)
{
VPtoDP(point.x,point.y,&xx1,&yy1);
blc*=(float)1.3;
m_xStart=xx1-blc*(point.x);
m_yStart=yy1-blc*(m_hScreen-point.y);
pDoc->AddScreen(m_xStart,m_yStart,blc);
// InitVScroll();
// InitHScroll();
Invalidate(); //使图形重画
}
else if(m_DrawCurrent==61||m_DrawCurrent==62||m_DrawCurrent==63) //正在进行窗口选择图形元素操作
{
bSelect=0;
if(PushNumb==0) //如果第一次按下鼠标左键
{
DispStatus("请用鼠标点中选择窗口的另一顶点");
mPointOrign=point; //原点等于点中点
mPointOld=point; //上一个点等于点中点
PushNumb++; //按键数增加1
SetCapture(); //捕捉鼠标
}
else if(PushNumb==1)//第二次按下左键
{
//得到左下点和右上点
x1=min(mPointOrign.x,point.x);
y1=max(mPointOrign.y,point.y);
x2=max(mPointOrign.x,point.x);
y2=min(mPointOrign.y,point.y);
VPtoDP(x1,y1,&xx1,&yy1);
VPtoDP(x2,y2,&xx2,&yy2);
PointXyz[0].x=xx1;
PointXyz[0].y=yy1;
PointXyz[1].x=xx1;
PointXyz[1].y=yy2;
PointXyz[2].x=xx2;
PointXyz[2].y=yy2;
PointXyz[3].x=xx2;
PointXyz[3].y=yy1;
PointXyz[4].x=xx1;
PointXyz[4].y=yy1;
m_pPline=new CPline(1,1,1,0,0,0,0,5,PointXyz,0);
CDraw* pDraw;
for(int i=1;i<=7;i++) //对7类图形元素循环
{
int nn=pDoc->GetGraphUpperBound(i)+1; //得到图形元素的数目
while(nn-->pDoc->GraphNumbStart[i-1])
{
pDraw=pDoc->GetGraph(i,nn);
if(pDraw&&pDraw->IsRgnSelect(m_DrawCurrent-60,xx1,yy1,xx2,yy2,1))
{
bSelect=1;
pDoc->AddSelectList(i,nn,pDraw->GetID());
}
}
}
delete m_pPline;
DispStatus("请用鼠标点中选择窗口的一个顶点");
PushNumb=0; //完成操作,左键按下数置0
if(bSelect) //如果选中了图形元素
Invalidate();
ReleaseCapture(); //释放捕捉的鼠标
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?