SetWindowOrg,SetViewportOrg,SetWindowExt,SetViewportExt

来源:互联网 发布:淘宝无货空挂的处罚 编辑:程序博客网 时间:2024/04/29 16:14

page space && device space
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetWindowOrg(40,0);  //这句“设定”page space的原点为(40,0),注意,
//这时(40,0)就是原点,原点就是(40,0)这个点,其实,(0,0)与原点没有必然联系。这
//一句对下面的画图函数在page space中所作的图不会有任何影响。一句话:SetWindowOrg
//就是指定一下,page space中哪个点为原点。
pDC->Rectangle(0,0,100,-100);
pDC->Rectangle(0,-100,50,-200);

同理,SetViewportOrg也是指定一下,device space中哪个点为原点,两个坐标系映射时,两个原点重合。

SetWindowExt设定page space的大小,SetViewportOrg设定device space的大小,其实,真正有意义的只是两者的比例关系,例如,在一个1024*768的显示屏上:

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个象素。因此,下面的代码有相同的作用:

pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(102400,76800);
pDC->SetViewportExt(10240,7680);
pDC->Rectangle(0,0,100,100);

两者本质一样,前者更易于理解。
来源: 九九星个人主页 --
程序设计 -- C++程序设计

 

 

 

 

房客大杂烩在VC++技术内幕(第四版)笔记--SetWindowExt和SetViewportExt 中说的也很好:

 

CRect rectClient;

GetClientRect(rectClient); //获取物理设备大小

 

pDC->SetMapMode(MM_ANISOTROPIC); //设置映射模式

pDC->SetWindowExt(CSize(1000,1000));    //设备逻辑窗口大小(可能与物理窗口大小不一样)

pDC->SetViewportExt(rectClient.right,-rectClient.bottom); //设置物理设备范围,为设定圆点作准备

pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2); //设置物理设备坐标原点,当然是在上一行代码的基础之上

pDC->Ellipse(-500,-500,500,500); //以物理设置坐标原点为基础,以逻辑为单位,画圆。

(http://www.cnblogs.com/sxlfybb/archive/2006/06/13/424770.html)

原创粉丝点击