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语句才能正确地将背景贴出来,然后在上面作图。大侠解答一下吧!!~~
   顺便问一句,这样绘图应该是实现了双缓冲了吧?

解决方案 »

  1.   

    是双缓冲了。你的问题出在,改了映射模式后,你的图像的信息还是用象素做的单位。
    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);中的参数也是象素坐标。在新的映射模式下,会认为这些是新坐标系统下的坐标值,当然出问题了。
      

  2.   

    我一开始就知道是这个原因。:)
    但是就是不知道如何转换两个坐标。
    我需要将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不等?