查了一晚上资料,终于把窗口视口的映射搞明白了。
窗口是指一个虚拟存在的屏幕,看不到的,而视口是在屏幕上看到的视图客户区域。
Windows绘图时,并不是把图形直接绘制到屏幕上去,而是以各种方式下的坐标系将图形绘制到序幕的窗口中,然后将这个窗口的内容映射到视口中,
如果映射到屏幕,就实现了图形的显示,如果映射到打印机,就实现了图形的打印。
坐标系分三种:整屏幕坐标,整窗口坐标,客户区坐标.
视口是基于设备坐标(像素)的,通常是指客户区,整个窗口或者整个屏幕.设备坐标原点(0,0)始终是客户区,整个窗口或者整个屏幕左上角.
窗口是基于逻辑坐标(像素,mm,英寸等任何单位)的,逻辑坐标原点可以映射到设备坐标的任何点.
视口原点,基于设备坐标,比如设备坐标(10,10)
窗口原点,基于逻辑坐标,比如逻辑坐标(10,10)
视口原点和窗口原点始终映射为同一点,
一定要把窗口原点和逻辑坐标原点,视口原点和设备坐标系原点区分开!!!
SetViewportOrgEx(x,y); //参数使用设备坐标,把设备点(x,y)设为视口原点,(同时也是窗口原点)
SetWindowOrgEx(x,y); //参数使用逻辑坐标,把逻辑点(x,y)设为窗口原点
//两个函数一起使用
SetViewOrgEx(hdc,cxClient/2,cyClient/2,NULL);
//此时,视口原点是设备坐标(cxClient/2,cyClient/2),窗口原点是逻辑坐标(0,0);
//逻辑坐标系的原点在屏幕中间,设备坐标系原点不变,在客户区(窗口,屏幕)左上角
SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);
//此时,视口原点是设备坐标(cxClient/2,cyClient/2),窗口原点是逻辑坐标(-cxClient/2,-cyClient/2);
//逻辑坐标系的原点在屏幕右下角,设备坐标系原点不变,在客户区(窗口,屏幕)左上角
逻辑坐标和设备坐标的变换:
(Xviewport-Xvieworg)/(Xwindow-Xwinorg)= Xviewext / Xwinext;
(Yviewport-Yvieworg)/(Ywindow-Xwinorg)= Yviewext / Ywinext;
(Xvieworg,Yvieworg)是视口原点,设备坐标;
(Xwinorg,Xwinorg)是窗口原点,逻辑坐标;
(Xviewport,Yviewport)是设备点,与逻辑点(Xwindow,Ywindow)对应;
(Xwindow,Ywindow)是逻辑点;
(xViewExt,yViewExt)是设备坐标的窗口范围;
(xWinExt,yWinExt)是逻辑坐标的窗口范围;
不对的地方,欢迎高手指正!