逻辑坐标和设备坐标的 SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;到底是个什么原理,一直想不通。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 去百度百科或者msdn搜一下 明白了 说的很清楚 SetWindowOrg 、SetViewportOrg、SetWindowExt、SetViewportExt区别按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:page space---->device spacepDC->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); 看了下heksn的解释的确是醍醐灌顶的感觉。其实问题本身我没说清楚:我比如我现在在MM_TEXT的映射方式下,同时执行SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL);为什么逻辑坐标系会跑到客户区的右下角。实际上第一行把设备坐标的原点设定到原来的(cxClient / 2,cyClient / 2)的位置,而第二行把逻辑坐标的原点设定到原来(-cxClient / 2,-cyClient / 2)的位置。那么很显然逻辑坐标(-cxClient / 2,-cyClient / 2)就应该映射到设备坐标(cxClient / 2,cyClient / 2)了。十分感谢。 怎么获取网页源文件控件id 求助:GlobalAlloc、CreateStreamOnHGlobal的问题 cscrollbar例子的困惑 XML解析,释放试内存泄漏 刚才分给少了,再来一贴,三分绝杀,庆功! 在MFC内部WM_CTLCOLOR、WM_HSCROL、WM_VSCROL这些消息是如何反射给子控件的,能否找出源代码 建立连接后用的是什么协议? 打印时产生了循环。 我的release版程序为什么比debug生成的还大?? 请教高手:对话框的主窗口必须是模式的吗 谁用过这样的控件,请大家帮帮忙~~ socket编程中的select模型关于写操作的小问题?请教下,谢谢!
按习惯,(0,0)就原点,原点就是(0,0),但是如果用此来理解windows的map mode,就会走弯路。其实,稍微改变一下观念,windows的map mode就比较好理解了。举例说明:
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);
我比如我现在在MM_TEXT的映射方式下,同时执行
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL);
为什么逻辑坐标系会跑到客户区的右下角。实际上第一行把设备坐标的原点设定到原来的(cxClient / 2,cyClient / 2)的位置,而第二行把逻辑坐标的原点设定到原来(-cxClient / 2,-cyClient / 2)的位置。那么很显然逻辑坐标(-cxClient / 2,-cyClient / 2)就应该映射到设备坐标(cxClient / 2,cyClient / 2)了。十分感谢。