vc中如何把窗口坐标系转为笛卡尔坐标系

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/24 20:34:27
vc中如何把窗口坐标系转为笛卡尔坐标系vc中如何把窗口坐标系转为笛卡尔坐标系vc中如何把窗口坐标系转为笛卡尔坐标系他的好处是窗口中的每一点坐标不会随着窗口的大小而改变,即你改变窗口时窗口中的图形不会改

vc中如何把窗口坐标系转为笛卡尔坐标系
vc中如何把窗口坐标系转为笛卡尔坐标系

vc中如何把窗口坐标系转为笛卡尔坐标系
他的好处是窗口中的每一点坐标不会随着窗口的大小而改变,即你改变窗口时窗口中的图形不会改变.函数1:模式选择int SetMapMode( __in HDC hdc, __in int fnMapMode );fnMapMode可传入MM_TEXT,MM_ISOTROPIC,MM_ANISOTROPIC等参数函数2:设置新的高度和宽度BOOL SetWindowExtEx( __in HDC hdc,//设备环境句柄 __in int nXExtent,//新的宽度(如果为MM_ISOTROPIC则nXExtent和nYExtent必须相等) __in int nYExtent,//新的高度 __out LPSIZE lpSize//用于返回原来的大小,不需要设为NULL );不管真实的窗口区域大小是多少,该函数告诉windows窗口的逻辑宽是nXExtent,逻辑高度是nYExtent.windows会将DC代表的区域的宽度nXExtent等分,每份的长度就是X方向上的单位长度,将高度nYExtent等分得到y轴上的单位长度函数3:设置x,y坐标轴的方向和坐标轴的范围,即定义域和值域BOOL SetViewportExtEx( __in HDC hdc,//设备环境句柄 __in int nXExtent,//新的宽度(以像素为单位,定义域) __in int nYExtent,//新的高度(以像素为单位,值域) __out LPSIZE lpSize//用于返回原来的大小,不需要设为NULL);要想坐标系包含整个区域,直接把区域的真实大小传递给此函数即可.参数nXExtent和nYExtent为正表示与默认坐标系方向相同,即向右向下为X,Y的正方向,为负表示与默认方向相反函数4:设置坐标系的原点坐标BOOL SetViewportOrgEx( __in HDC hdc, __in int X,//原点横坐标 __in int Y,//原点纵坐标 __out LPPOINT lpPoint );演示代码1:画内切与客户区的圆(坐标系不变)case WM_PAINT: RECT rt; int cx,cy; GetClientRect(hWnd,&rt); hdc = BeginPaint(hWnd, &ps); cx = rt.right; cy = rt.bottom; //设置客户区的逻辑大小为500*500,原点为(0,0) SetMapMode(hdc,MM_ISOTROPIC); SetWindowExtEx(hdc,500,500,NULL); SetViewportExtEx(hdc,cx,cy,NULL); //SetViewportOrgEx(hdc,cx/2,cy/2,NULL); SetViewportOrgEx(hdc,0,0,NULL); //MoveToEx(hdc,0,0,NULL); //LineTo(hdc,-200,-200); Ellipse(hdc,0,0,500,500); EndPaint(hWnd, &ps); break; 画出的圆会随着边框的改变而改变演示代码2:笛卡尔坐标系下画圆case WM_PAINT: RECT rt; int cx,cy; GetClientRect(hWnd,&rt); hdc = BeginPaint(hWnd, &ps); cx = rt.right; cy = rt.bottom; //设置客户区的逻辑大小为500*500,原点为中点 SetMapMode(hdc,MM_ISOTROPIC); SetWindowExtEx(hdc,500,500,NULL); SetViewportExtEx(hdc,cx,-cy,NULL); //设置坐标轴方向 SetViewportOrgEx(hdc,cx/2,cy/2,NULL);//设置原点 //SetViewportOrgEx(hdc,0,0,NULL); //MoveToEx(hdc,0,0,NULL); //LineTo(hdc,-200,-200); Ellipse(hdc,-250,250,250,-250); //画圆 EndPaint(hWnd, &ps); break; 注意;如果选择MM_ANISOTROPIC则会画出椭圆