目录
一、创建Test工程
二、自定义坐标系
三、映射模式(MapMode)
四、映射模式函数
1)设置映射模式函数
2)设置窗口范围函数
3)设置视区范围函数
4)设置视区原点函数
5)偏移矩形函数
五、 不改变映射模式修改坐标系
一、创建Test工程
1、新建单文档项目
2、绘制二维图像实在CTestView类中的OnDraw函数,OnDraw函数中被注释的指针PDc要放开(纯虚函数)
3、在MFC框架中,窗口显示的是像素,屏幕以像素为基准。
二、自定义坐标系
三、映射模式(MapMode)
模式代码 | 宏定义值 | 坐标系特征 |
MM_TEXT | 1 | 每个逻辑单位被转换为1个设备像素,正x向右,正y向下 |
MM_LOMETRIC | 2 | 每个逻辑单位被转换为0.1毫米,正x向右,正y向上 |
MM_HIMETRIC | 3 | 每个逻辑单位被转换为0.01毫米,正x向右,正y向上 |
MM_LOENGLISH | 4 | 每个逻辑单位被转换为0.01英寸,正x向右,正y向上 |
MM_HIENGLISH | 5 | 每个逻辑单位被转换为0.001英寸,正x向右,正y向上 |
MM_TWIPS | 6 | 每个逻辑单位被转换为1/20点(一点是1/72英寸,一个twip是1/1440英寸),正x向右,正y向上 |
MM_ISOTROPIC | 7 | 在保证x轴和y轴比例相等的情况下,逻辑单位被转换为任意的单位,且方向可以独立设置 |
MM_ANISOTROPIC | 8 | 逻辑单位被转换为任意的单位,x轴和y轴的方向和比例独立设置 |
四、映射模式函数
1)设置映射模式函数
原型:virtual int SetMapMode(int nMapMode);
参数:nMapMode用于指定新的映射模式,可常取MM_ANISOTROPIC。
MM_ANISOTROPIC是窗口范围和设备范围可以任意改变,要求使用SetWindowExt函数设置窗口的范围,使用SetViewPortExt函数设置视区的范围。
2)设置窗口范围函数
原型:virtual CSize SetWindowExt(int cx,int cy);
参数:cx窗口x范围的逻辑单位,cy窗口y范围的逻辑单位;
3)设置视区范围函数
原型:virtual CSize SetViewportExt(int cx,int cy);
参数:cx视区x范围的设备单位,cy视区y范围的设备单位;
4)设置视区原点函数
原型“:virtual CPoint SetViewportOrg(int x,int y);
参数:x,y是视区新原点的设备坐标;
5)偏移矩形函数
原型:void OffsetRect(int x,int y);
参数:x左右偏移量,y上下偏移量;
// TODO: 在此处为本机数据添加绘制代码
CRect rect; //定义一个矩形对象
GetClientRect(rect);//初始化(rect不是一个数值,很多属性)
//使用映射模式函数
pDC->SetMapMode(8);
//设置窗口的大小
pDC->SetWindowExt(rect.Width(),rect.Height());//矩形的宽高作为窗口大小
//设置视区大小
pDC->SetViewportExt(rect.Width(),-rect.Height());
//圆点
pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
//此时矩形位置随坐标系变化,应该是在右上角,需要进行平移
rect.OffsetRect(-rect.Width() / 2,-rect.Height() / 2);
//绘制一个三角形
CPoint P0(-200, -100), P1(200, -100), P2(0,200);
pDC->MoveTo(P0);
pDC->LineTo(P1);
pDC->LineTo(P2);
pDC->LineTo(P0);
五、 不改变映射模式修改坐标系
CRect rect;
GetClientRect(&rect);
int nClientWidth = rect.Width();
int nClientHeight = rect.Height();
int nHWidth = nClientWidth/2;
int nHHeigh = nClientHeight/2;
CPoint P0(-200, -100), P1(200, -100), P2(0,200);
pDC->MoveTo(nHWidth + P0.x,nHHeight - P0.y);
pDC->LineTo(nHWidth + P1.x,nHHeight - P1.y);
pDC->LineTo(nHWidth + P2.x,nHHeight - P2.y);
pDC->LineTo(nHWidth + P0.x,nHHeight - P0.y);
通过比较可知,第一种更方便。