本人刚学图形学,又没学过MFC,所以问下各位高手
书中有一代码如下:
void CTest::OnDraw(CDC *pdc){
    CTest Doc *pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect Rect;
    GetClientRect(&Rect);
    pDc -> SetMapMode(MM_ANISOTROPIC);
    //pay attention!
    pDC -> SetWindowExt(Rect.width(),Rect.Height());//这个是以逻辑单位计算的吗?
    pDC -> SetViewPortExt(Rect.right,-Rect.bottom);//以物理单位吗?
}
从书本描述知,SetWindowExt调整窗口范围SetViewPortExt调整视区范围
但为什么参数一个是Rect.width(),Rect.Height()另一个是Rect.right,Rect.bottom
难道width()返回的是逻辑单位,而right返回的是物理单位吗?还是Rect.left 、 top 、right、bottom 的数值是怎么得到的?以屏幕左上角为(0,0)作为参照吗?请分别解答好吗,thank you ! Orz!

解决方案 »

  1.   

    VC6的MSDN帮助中有一篇专门讲坐标映射关系的
    mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\techart.chm::/html/msdn_mapping.htm
    把红色的部分替换成你的MSDN的路径,在MSDN中有跳转至URL,填入改过的链接地址
      

  2.   

    首先你得弄清楚GetClientRect函数的作用:该函数获取窗口客户区的坐标。客户区坐标指定客户区的左上角和右下角。由于客户区坐标是相对窗口客户区的左上角而言的,因此左上角坐标为(0,0)也就是说,获取结果CRect结构中的CRect.left=0;CRect.top=0;CRect.right=x;CRect.bottom=y
    (这里,x的值其实就等于Rect.width(),y的值等于Rect.Height())其次,映射关系:
    所谓映射就是物理和逻辑的映射。使用GetClientRect方法后,获取到窗口的物理大小;然后再使用SetWindowExt,设置了窗口的逻辑大小,与之相对应的是SetViewportExt,也就是说在这里作了一个映射。SetWindowExt中的第一个参数
    窗口宽度与 SetViewportExt中的第一个参数
    相对应起来,逻辑宽度和物理宽度映射,逻辑高度和物理高度映射。这样,一旦映射关系确立之后,再使用后面的方法进一步的操作。映射关系是有这两个函数来确定的,所以
    “pDC -> SetWindowExt(Rect.width(),Rect.Height());//这个是以逻辑单位计算的吗?
      pDC -> SetViewPortExt(Rect.right,-Rect.bottom);//以物理单位吗?”单纯的认为以什么单位计算是不合理的而且在你的上述代码中,映射比是1:1,
    看看这段代码:
    pDC->SetMapMode(MM_ISOTROPIC);
    pDC->SetWindowExt(10240,7680);
    pDC->SetViewportExt(1024,768);
    pDC->Rectangle(0,0,100,100);  就会画一个10 pixels*10 pixels的矩形。其本质就是,X方向,每个逻辑单位有1024/10240个象素,Y方向每个逻辑单位有768/7680个象素。
      

  3.   

    首先多谢lsq19871207的回答Orz! 
    你说"这里,x的值其实就等于Rect.width(),y的值等于Rect.Height()"
    就是说它们是等价的,就好像是以下这样写吗?
    struct Rect{
       long right;
       long width(){return right;}
    };那么它们的作用就是自定义坐标单位: 物理/逻辑(像素)和方向:(上例的y与物理的y相反)吗?