void CSatelliteView::OnDraw(CDC* pDC)
{
UNUSED_ALWAYS(pDC); CSatelliteDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect m_rect;
GetClientRect(&m_rect);
CDC BcakGroundDC;
BcakGroundDC.CreateCompatibleDC(pDC);
CBitmap*pbmpOld=BcakGroundDC.SelectObject(&m_Bitmap);
/////////////////////////////////////////////////////
/*int du=10000;
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(-180*du,90*du);
pDC->SetWindowExt(360*du,-180*du);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(m_rect.Width(),m_rect.Height());*/
///////////////////////////////////////////////////////////
Redraw(&BcakGroundDC,SubpointLon,SubpointLat);
pDC->StretchBlt(0,0,m_rect.right,m_rect.bottom,
&BcakGroundDC,0,0,m_Width,m_Height,SRCCOPY);
BcakGroundDC.SelectObject(pbmpOld);//恢复原状
BcakGroundDC.DeleteDC();Redraw是一个绘图函数。void CSatelliteView::Redraw(CDC *pDC,double *SubpointLon, double *SubpointLat)
{
int du=10000;
CPen NewPen;//声明画笔对象
CPen *pOldPen;//保存原先画笔的指针
//初始化实线、1象素宽的绿色画笔
NewPen.CreatePen(PS_SOLID,1,RGB(255,0,255));
//将画笔选入设备文本对象
pOldPen=pDC->SelectObject(&NewPen);
int i;
for(i=0;i<size-1;i++)
{
if (fabs(SubpointLon[i+1]-SubpointLon[i])>=300)
{
pDC->MoveTo(int(SubpointLon[i+1]*du),int(SubpointLat[i+1]*du));
}
else
{
pDC->MoveTo(int(SubpointLon[i]*du),int(SubpointLat[i]*du));
pDC->LineTo(int(SubpointLon[i+1]*du),int(SubpointLat[i+1]*du));
}
}
//恢复原先的画笔对象
pDC->SelectObject(pOldPen); 问题在于贴图之前没有改变映射模式,而画图时,即调用Redraw时又需要/*.......*/
中的映射模式,这样,原来贴的背景地图就无法显示。如果将/*.......*/中的语句放在最前面,背景地图还是无法显示,显然是因为坐标变换的问题。
我就是不知道在先设置了映射模式的情况下,该怎样写StretchBlt语句才能正确地将背景贴出来,然后在上面作图。大侠解答一下吧!!~~
顺便问一句,这样绘图应该是实现了双缓冲了吧?
{
UNUSED_ALWAYS(pDC); CSatelliteDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect m_rect;
GetClientRect(&m_rect);
CDC BcakGroundDC;
BcakGroundDC.CreateCompatibleDC(pDC);
CBitmap*pbmpOld=BcakGroundDC.SelectObject(&m_Bitmap);
/////////////////////////////////////////////////////
/*int du=10000;
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(-180*du,90*du);
pDC->SetWindowExt(360*du,-180*du);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(m_rect.Width(),m_rect.Height());*/
///////////////////////////////////////////////////////////
Redraw(&BcakGroundDC,SubpointLon,SubpointLat);
pDC->StretchBlt(0,0,m_rect.right,m_rect.bottom,
&BcakGroundDC,0,0,m_Width,m_Height,SRCCOPY);
BcakGroundDC.SelectObject(pbmpOld);//恢复原状
BcakGroundDC.DeleteDC();Redraw是一个绘图函数。void CSatelliteView::Redraw(CDC *pDC,double *SubpointLon, double *SubpointLat)
{
int du=10000;
CPen NewPen;//声明画笔对象
CPen *pOldPen;//保存原先画笔的指针
//初始化实线、1象素宽的绿色画笔
NewPen.CreatePen(PS_SOLID,1,RGB(255,0,255));
//将画笔选入设备文本对象
pOldPen=pDC->SelectObject(&NewPen);
int i;
for(i=0;i<size-1;i++)
{
if (fabs(SubpointLon[i+1]-SubpointLon[i])>=300)
{
pDC->MoveTo(int(SubpointLon[i+1]*du),int(SubpointLat[i+1]*du));
}
else
{
pDC->MoveTo(int(SubpointLon[i]*du),int(SubpointLat[i]*du));
pDC->LineTo(int(SubpointLon[i+1]*du),int(SubpointLat[i+1]*du));
}
}
//恢复原先的画笔对象
pDC->SelectObject(pOldPen); 问题在于贴图之前没有改变映射模式,而画图时,即调用Redraw时又需要/*.......*/
中的映射模式,这样,原来贴的背景地图就无法显示。如果将/*.......*/中的语句放在最前面,背景地图还是无法显示,显然是因为坐标变换的问题。
我就是不知道在先设置了映射模式的情况下,该怎样写StretchBlt语句才能正确地将背景贴出来,然后在上面作图。大侠解答一下吧!!~~
顺便问一句,这样绘图应该是实现了双缓冲了吧?
pDC->SetViewportExt(m_rect.Width(),m_rect.Height());*/这句话中m_rect的坐标是象素为单位的,你没有转换。仅仅改映射模式是不够的。pDC->StretchBlt(0,0,m_rect.right,m_rect.bottom,
&BcakGroundDC,0,0,m_Width,m_Height,SRCCOPY);中的参数也是象素坐标。在新的映射模式下,会认为这些是新坐标系统下的坐标值,当然出问题了。
但是就是不知道如何转换两个坐标。
我需要将m_Width和m_Height转换为对应的新系统下的坐标值,假设为x,y,然后
pDC->StretchBlt(-180*du,90*du,360*du,180*du,
&BcakGroundDC,(-180*du,90*du,x,y,SRCCOPY);
对吗?
如果不对,该怎样写?!!!!!!!!!!
对了调试过程中,发现如果用pDC->StretchBlt(0,0,m_rect.width(),m_rect.height(),
&BcakGroundDC,0,0,m_Width,m_Height,SRCCOPY);
显示的图形大小不对,书上不是说第3,4个参数是目标矩形的大小吗?为什么m_rect.width(),m_rect.height(),和m_rect.right,m_rect.bottom不等?