MFC picture control画图 画在控件外的部分如何擦除
MFC原本坐标范围画图效果如下:我想通过改变坐标显示范围,从而实现局部放大的功能将坐标显示范围变为原来的0.8后,效果图如下:现在我想讲控件周围画出的内容擦除掉,不知该如...
MFC原本坐标范围画图效果如下:
我想通过改变坐标显示范围,从而实现局部放大的功能
将坐标显示范围变为原来的0.8后,效果图如下:
现在我想讲控件周围画出的内容擦除掉,不知该如何做,还请给位高手指导。
画图部分代码如下,zoom为放大比例,第一张图zoom=1.0,第二张图zoom=0.8:
void CMy0414CoastDlg::DrawCoast()//绘制coast图{ int i,j; int ii = 1; double a, b;//用来作为坐标变换的中间变量
ReadingData();
/*********坐标变换*****************/ for (i = 0; i<sizeof(latitude) / 8; i++) { WGS84ToMercator(latitude[i] * 60, longitude[i] * 60, &a, &b, 0, 0, 0);//单位是分 cx[i] = a; cy[i] = b; }
/************画图********************/ CRect rect; CWnd *pWnd; CDC *dc = GetDlgItem(IDC_Track)->GetDC(); pWnd = GetDlgItem(IDC_Track);//获得pictrue控件窗口的句柄 pWnd->GetClientRect(&rect);//获得pictrue控件所在的大小
WGS84ToMercator(-86 * 60, 179.9 * 60, &a, &b, 0, 0, 0);//逻辑坐标范围
FillRect(pWnd->GetDC()->GetSafeHdc(), &rect, CBrush(RGB(135,206,250)));//picture空间背景颜色为淡蓝色 dc->SetMapMode(MM_ANISOTROPIC); dc->SetWindowExt(abs(zoomby - b) * 2 * zoom, abs(zoombx - a) * 2 * zoom);//设置坐标范围,经度[-179~189],纬度[-86~86],经纬度坐标变换为直角坐标的值 dc->SetViewportExt(rect.right, -rect.bottom);//正北、正东为正方向 dc->SetViewportOrg(rect.right / 2, rect.bottom / 2);//设置窗口中心点为坐标系原点,使用物理坐标// dc->SetWindowOrg(zoomy - b, zoomx - a);//设置逻辑坐标原点在中心
POINT p[3000];//开辟足够大的空间存放点 for (i = 0; i<sizeof(flag) / 4 - 1; i++)
{ CRgn rg; CBrush b(RGB(0,255,127));//封闭图形颜色填充 dc->SelectObject(&b); dc->MoveTo(int(cy[flag[i]]), int(cx[flag[i]]));//画第一个点 p[0] = { int(cy[flag[i]]), int(cx[flag[i]]) };//转化为point类才能使用polygon填充颜色
for (j = flag[i] + 1; j<flag[i + 1]; j++) { dc->LineTo(int(cy[j]), int(cx[j])); //画其余点 if (ii != (flag[i + 1] - flag[i])) { p[ii] = { cy[j], cx[j] }; ii++; } } dc->Polygon(p,(flag[i+1]-flag[i]-1));//填充颜色点位置、个数 ii = 0;
} //UpdateWindow(0); } 展开
我想通过改变坐标显示范围,从而实现局部放大的功能
将坐标显示范围变为原来的0.8后,效果图如下:
现在我想讲控件周围画出的内容擦除掉,不知该如何做,还请给位高手指导。
画图部分代码如下,zoom为放大比例,第一张图zoom=1.0,第二张图zoom=0.8:
void CMy0414CoastDlg::DrawCoast()//绘制coast图{ int i,j; int ii = 1; double a, b;//用来作为坐标变换的中间变量
ReadingData();
/*********坐标变换*****************/ for (i = 0; i<sizeof(latitude) / 8; i++) { WGS84ToMercator(latitude[i] * 60, longitude[i] * 60, &a, &b, 0, 0, 0);//单位是分 cx[i] = a; cy[i] = b; }
/************画图********************/ CRect rect; CWnd *pWnd; CDC *dc = GetDlgItem(IDC_Track)->GetDC(); pWnd = GetDlgItem(IDC_Track);//获得pictrue控件窗口的句柄 pWnd->GetClientRect(&rect);//获得pictrue控件所在的大小
WGS84ToMercator(-86 * 60, 179.9 * 60, &a, &b, 0, 0, 0);//逻辑坐标范围
FillRect(pWnd->GetDC()->GetSafeHdc(), &rect, CBrush(RGB(135,206,250)));//picture空间背景颜色为淡蓝色 dc->SetMapMode(MM_ANISOTROPIC); dc->SetWindowExt(abs(zoomby - b) * 2 * zoom, abs(zoombx - a) * 2 * zoom);//设置坐标范围,经度[-179~189],纬度[-86~86],经纬度坐标变换为直角坐标的值 dc->SetViewportExt(rect.right, -rect.bottom);//正北、正东为正方向 dc->SetViewportOrg(rect.right / 2, rect.bottom / 2);//设置窗口中心点为坐标系原点,使用物理坐标// dc->SetWindowOrg(zoomy - b, zoomx - a);//设置逻辑坐标原点在中心
POINT p[3000];//开辟足够大的空间存放点 for (i = 0; i<sizeof(flag) / 4 - 1; i++)
{ CRgn rg; CBrush b(RGB(0,255,127));//封闭图形颜色填充 dc->SelectObject(&b); dc->MoveTo(int(cy[flag[i]]), int(cx[flag[i]]));//画第一个点 p[0] = { int(cy[flag[i]]), int(cx[flag[i]]) };//转化为point类才能使用polygon填充颜色
for (j = flag[i] + 1; j<flag[i + 1]; j++) { dc->LineTo(int(cy[j]), int(cx[j])); //画其余点 if (ii != (flag[i + 1] - flag[i])) { p[ii] = { cy[j], cx[j] }; ii++; } } dc->Polygon(p,(flag[i+1]-flag[i]-1));//填充颜色点位置、个数 ii = 0;
} //UpdateWindow(0); } 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询