📄 drawshapeview.cpp
字号:
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
SetCapture();
LPtoAP(point.x,point.y,&x,&y);
m_PointArray[m_PushNum].x=x;
m_PointArray[m_PushNum].y=y;
if(m_PushNum == 0)
{
m_PointOld=point;
m_PointOrg=point; //只要按下左键就要重新记录为原点
}
else
{
m_PointOld=m_PointOrg;
m_PointOrg=point; //只要按下左键就要重新记录为原点
MemDC.MoveTo(m_PointOld);
MemDC.LineTo(point);
}
clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
/*
if(m_PushNum == 0)
{
m_PointOrg=point; //只要按下左键就要重新记录为原点
m_PointOld=point;
}
else
{
m_PointOrg = m_PointOld;
m_PointOld = point;
}
MemDC.MoveTo(m_PointOrg);
MemDC.LineTo(m_PointOld);
clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
*/
m_PushNum++;
// }
// else
// {
// m_PointOrg=point;
// }
}
else if(m_DrawType == 4) //画点
{
CDrawShapeDoc* pDoc=GetDocument();
CClientDC client_dc(this);
// CDC MemDC;
// MemDC.CreateCompatibleDC(NULL);
// CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
float fXcoord; //X、Y坐标
float fYcoord;
LPtoAP(point.x,point.y,&fXcoord,&fYcoord);
// CPointShape* pPoint = new CPointShape(m_ColorPen,m_ColorBrush,
// m_LineWide,m_LineType,m_Layer,gpCGraphPara->GetIdOnly(),0,
// fXcoord,fYcoord);
pDoc->AddPoint(m_ColorPen,m_ColorBrush, m_LineWide,
m_LineType,m_Layer,2/*m_Layer,gpCGraphPara->GetIdOnly()*/,0,
fXcoord,fYcoord)->Draw(&client_dc,0,0,m_Color);
// clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
// MemDC.SelectObject(pOldBitmap);
// MemDC.DeleteDC();
}
else if(m_DrawType==13 || m_DrawType==21)//进行框选放大或移动
{
//放大时改变起始坐标及比例尺
if(m_DrawType==13) //框选放大
{
if(m_PushNum==0)
{
m_PointOrg=point;
m_PointOld=point;
m_PushNum++;
SetCapture();
}
else if(m_PushNum==1)
{
//得到放大或移动矩形区域左下点和右上点像素坐标
int x1,y1,x2,y2;
x1=min(m_PointOrg.x,point.x);
y1=max(m_PointOrg.y,point.y);
x2=max(m_PointOrg.x,point.x);
y2=min(m_PointOrg.y,point.y);
//将左下点(x1,y1)设为当前屏幕的起始点(实际坐标)
LPtoAP(x1,y1,&m_xStart,&m_yStart);
float blc1=(float)m_wScreen/(x2-x1);
float blc2=(float)m_hScreen/(y1-y2);
if(blc2<blc1)
blc1=blc2; //取较小的变化比例
if(blc1>0)
blc=blc/blc1; //改变显示比例
// float blc1=(float)(x2-x1)/m_wScreen;
// float blc2=(float)(y1-y2)/m_hScreen;
//取纵横方向的较小比例尺
// blc=(blc1 < blc2 ? blc1:blc2);
// m_DrawType=0; //结束框选放大
m_PushNum=0; //使得再次点击左键时会再进行框选放大
}
}
/*
else //移动
{
//移动时只改变起始坐标m_xStart,m_yStart,但不改变比例尺blc
m_xStart=m_xStart-blc*(point.x-m_PointOrg.x);
m_yStart=m_yStart+blc*(point.x-m_PointOrg.y);
m_PushNum=0;
}
*/
ReleaseCapture();
Invalidate(); //重画,调用视图类OnDraw函数,从而在APtoLP中重新
//用现有m_xStart,m_yStart,blc进行放大或移动后的绘图
}
else if(m_DrawType==22) //如果是 hand-cursor move map
{
// m_PushNum=0;
m_PointOrg = point;
m_PointOld = point;
iNewX = 0; //设置位图拷贝到的新位置起点为0
iNewY = 0;
// Invalidate(); //获得位图
//获得鼠标按下去时的地图边界,在鼠标移动时
//改变此时地图边界的值,而不改变此时地图与
//屏幕的相交范围
int iXmin,iYmin,iXmax,iYmax;
float fXmin,fYmin,fXmax,fYmax;
CRect rcIntersect;
CRgn rgnScreen,rgnMap,rgnIntersect;
GetMapBound(fXmin,fYmin,fXmax,fYmax);
APtoLP(fXmin,fYmin,&iXmin,&iYmin);
APtoLP(fXmax,fYmax,&iXmax,&iYmax);
rgnMap.CreateRectRgn(iXmin,iYmin,iXmax,iYmax);
rgnScreen.CreateRectRgn(0,0,iWScreen,iHScreen);
rgnIntersect.CreateRectRgn(0,0,iWScreen,iHScreen);
rgnIntersect.CombineRgn(&rgnScreen,&rgnMap,RGN_AND);
rgnIntersect.GetRgnBox(&rcIntersect);
//记录相交矩形的左上角,右下角坐标
//在鼠标移动时,改变该矩形坐标位置
m_XminIntersect = rcIntersect.left;
m_YminIntersect = rcIntersect.top;
m_XmaxIntersect = rcIntersect.right;
m_YmaxIntersect = rcIntersect.bottom;
/*
GetMapBound(fXmin,fYmin,fXmax,fYmax);
APtoLP(fXmin,fYmin,&iXmin,&iYmin);
APtoLP(fXmax,fYmax,&iXmax,&iYmax);
rgnMap.CreateRectRgn(iXmin,iYmin,iXmax,iYmax);
rgnScreen.CreateRectRgn(0,0,iWScreen,iHScreen);
rgnFill.CreateRectRgn(0,0,iWScreen,iHScreen);
rgnFill.CombineRgn(&rgnScreen,&rgnMap,RGN_DIFF);
CDC MemDC; //首先定义一个显示设备对象
CBitmap MemBitmap; //定义一个位图对象
MemDC.CreateCompatibleDC(NULL);
m_MemBitmap.SetBitmapDimension(3*iWScreen,3*iHScreen);
CBitmap *pOldBit=MemDC.SelectObject(&m_MemBitmap);
MemDC.FillSolidRect(0,0,3*iWScreen,3*iHScreen,RGB(255,255,255));
//遍历所有图形元素并绘制
// 1-直线 2-连续直线或多边形区域 3-点
for(int i=1; i<4; i++)
{
for(int j=0; j <= pDoc->GetGraphUpperBound(i); j++)
{
pDoc->GetGraph(i,j)->Draw(&MemDC,0,0,m_Color);
}
}
//将内存(MemDC)中的图形拷贝到屏幕上(pDC)进行显示
// clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
//绘图完成后的清理
MemDC.SelectObject(pOldBit);
MemDC.DeleteDC(); //清除DC
*/
m_PushNum++;
SetCapture();
}
else if(m_DrawType==11) //放大
{
float Xold,Yold;
float x1,y1;
//放大前的左击鼠标点位置
LPtoAP(point.x,point.y,&Xold,&Yold);
//使比例改变,默认1.5的比例
blc /= 1.5;
//放大后的左击鼠标点位置
LPtoAP(point.x,point.y,&x1,&y1);
//算出放大前后鼠标点的偏移量
float Xdat=Xold - x1;
float Ydat=Yold - y1;
//使原点改变该偏移量,也就是使得鼠标点击处总于放大前的视图位置
m_xStart=m_xStart+Xdat;
m_yStart=m_yStart+Ydat;
//重画
Invalidate();
}
else if(m_DrawType==12) //缩小
{
float Xold,Yold;
float x1,y1;
//缩小前的左击鼠标点位置
LPtoAP(point.x,point.y,&Xold,&Yold);
//使比例改变,默认1.5的比例
blc *= 1.5;
//缩小后的左击鼠标点位置
LPtoAP(point.x,point.y,&x1,&y1);
//算出缩小前后鼠标点的偏移量
float Xdat=Xold - x1;
float Ydat=Yold - y1;
//使原点改变该偏移量,也就是使得鼠标点击处总于缩小前的视图位置
m_xStart=m_xStart+Xdat;
m_yStart=m_yStart+Ydat;
//重画
Invalidate();
}
CView::OnLButtonDown(nFlags, point);
}
void CDrawShapeView::OnDrawPolyline()
{
// TODO: Add your command handler code here
m_DrawType=2; //连续直线
m_PushNum=0;
}
void CDrawShapeView::OnDrawPolygon()
{
// TODO: Add your command handler code here
m_PushNum=0;
m_DrawType=3;//多边形区域
}
void CDrawShapeView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC client_dc(this);
// client_dc.SetROP2(R2_NOT);
// int iWScreen,iHScreen; //屏幕宽度、高度
// iWScreen = GetSystemMetrics(SM_CXSCREEN);
// iHScreen = GetSystemMetrics(SM_CYSCREEN);
//记录鼠标位置,在状态栏中显示
m_PointMouse=point;
if(m_DrawType==1 && m_PushNum==1)//画直线
{
CPen pen(m_LineType,m_LineWide,m_ColorPen);
CPen* pOldPen=client_dc.SelectObject(&pen);
/*
client_dc.MoveTo(m_PointOrg);//擦除
client_dc.LineTo(m_PointOld);
// client_dc.SetROP2(R2_COPYPEN);
*/
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
client_dc.MoveTo(m_PointOrg);//画橡皮线
client_dc.LineTo(point);
client_dc.SelectObject(pOldPen);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
/*
//当没有绘图操作时,不用进行以下MemDC等的创建
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(&client_dc,iWScreen,iHScreen);
CBitmap* pOldBitmap = MemDC.SelectObject(&MemBitmap);
CPen pen(PS_SOLID,m_LineWide,m_ColorPen);
CPen* pOldPen=MemDC.SelectObject(&pen);
MemDC.SetROP2(R2_NOT);
//填充白色背景
MemDC.FillSolidRect(0,0,iWScreen,iHScreen,RGB(255,255,255));
MemDC.MoveTo(m_PointOrg);//擦除
MemDC.LineTo(m_PointOld);
// client_dc.SetROP2(R2_COPYPEN);
MemDC.MoveTo(m_PointOrg);//画橡皮线
MemDC.LineTo(point);
client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldPen);
MemDC.SelectObject(pOldBitmap);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
*/
m_PointOld=point;
}
else if((m_DrawType==2 || m_DrawType==3) && m_PushNum > 0) //画连续直线或多边形区域
{
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
// client_dc.MoveTo(m_PointOrg);//擦除
// client_dc.LineTo(m_PointOld);
client_dc.MoveTo(m_PointOrg);//画橡皮线
client_dc.LineTo(point);
MemDC.SelectObject(pOldBitmap);
MemDC.DeleteDC();
// m_PointOld=point;
}
else if(m_DrawType==13 && m_PushNum==1) //框选放大
{
CClientDC dcClient(this);
dcClient.SetROP2(R2_NOT);
CPen pen(PS_DASH,m_LineWide,3);
// CBrush brush(RGB(152,0,0));
CPen* pOldPen=client_dc.SelectObject(&pen); //用虚线画矩形
// CBrush* pOldBrush=client_dc.SelectObject(&brush); //用虚线画矩形
dcClient.SelectStockObject(HOLLOW_BRUSH);
// client_dc.MoveTo(m_PointOrg.x,m_PointOrg.y);
dcClient.Rectangle(m_PointOrg.x,m_PointOrg.y,m_PointOld.x,m_PointOld.y);
dcClient.Rectangle(m_PointOrg.x,m_PointOrg.y,point.x,point.y);
m_PointOld=point;
dcClient.SelectObject(pOldPen);
// client_dc.SelectObject(pOldBrush);
}
else if(m_DrawType==22 && m_PushNum==1) //move map
{
float Xorg,Yorg,Xcur,Ycur; //实际坐标
float Xoffset,Yoffset; //偏移量
//算出当前点与原来点的实际偏移量
//以该偏移量改变起始点位置
//改变了其位置,但是没有重绘,只有在OnLButtonDown时才会重绘的
LPtoAP(m_PointOld.x,m_PointOld.y,&Xorg,&Yorg);
LPtoAP(point.x,point.y,&Xcur,&Ycur);
Xoffset = Xcur - Xorg;
Yoffset = Ycur - Yorg;
m_xStart -= Xoffset;
m_yStart -= Yoffset;
/* float Xmin,Ymin,Xmax,Ymax; //边界矩形坐标
int Xminlog,Yminlog; //逻辑坐标
int Xmaxlog,Ymaxlog;
*/
/*原来的代码
m_xStart-=(point.x-m_PointOrg.x)*blc/15;
m_yStart-=(m_PointOrg.y-point.y)*blc/15;
*/
//遍历所有图形元素并得到所有图形的边界矩形
// 1-直线 2-连续直线或多边形区域 3-点
/*
GetGraphBound(Xmin,Ymin,Xmax,Ymax);
APtoLP(Xmin,Ymin,&Xminlog,&Yminlog);
APtoLP(Xmax,Ymax,&Xmaxlog,&Ymaxlog);
CRect RectOld(Xminlog-1,Yminlog-1,Xmaxlog+1,Ymaxlog+1);
InvalidateRect(RectOld);
*/
/*
GetGraphBound(Xmin,Ymin,Xmax,Ymax);
APtoLP(Xmin,Ymin,&Xminlog,&Yminlog);
APtoLP(Xmax,Ymax,&Xmaxlog,&Ymaxlog);
CRect RectNew(Xminlog-1,Yminlog-1,Xmaxlog+1,Ymaxlog+1);
InvalidateRect(RectNew);
*/
CDC MemDC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -