设备描述表属性
当使用CDC输出函数在屏幕上画图时,输出的某些特性并没有在函数调用过程中规定(采用系统默认的属性画图),但我们可以通过设备描述表自身获得或得新设置属性。MFC提供了获得和设置这些属性的函数,我们可以用这些函数方便地改变画图时的默认属性。
例如:
CDC::SetTextColor//设置文本颜色
CDC::GetTextColor//获得文本颜色
CDC::SetBkColor//设置背景颜色
CDC::SetBkMode//设置背景模式
CDC::SetMapMode//设置映射模式
CDC::CDC::SetROP2//设置绘图模式
CDC::MoveTo//当前位置
CDCL::SelectObject//当前画笔,当前画刷,当前字体
(如果想忽略背景色,可将背景设置为"Transparent",dc.SetBkMode(TRANSPARENT);)
映射模式
默认映射模式
固定比例映射模式
可编程映射模式
默认的映射模式
默认的映射模式使MM_TEXT,它使以象素为单位的。X轴向左为正,Y轴向下为正。默认的坐标原点在左上角。
固定比例映射模式
固定比例的映射模式有MM_LOMETRIC、MM_HIMETRIC、MM_LOENGLISH、MM_HIENGLISH、MM_TWIPS种。
它们默认的坐标原点都使在左上角。其区别在于每一个逻辑单位对应的物理大小不一样。
所对用的逻辑单位分别为0.1毫米,0.01毫米,0.01英寸,0.001英寸,1/1440英寸(0.0007英寸)。
可变比例映射模式(可编程映射模式)
对于可变比例的映射模式用户可以自己定义一个逻辑单位代表的大小,其大小可以任意。
也可以让这个大小随环境改变而改变。有MM_ISOTROPIC,MM_ANISOTROPIC这两种映射模式。
其逻辑单位的大小等于视口范围和窗口范围的比值。
两者的不同在于前者要求X轴和Y轴的度量单位必须相同,而后者没有这样的限制。
可编程映射模式
MM_ISOTROPIC和MM_ANISOTROPIC是由用户决定从逻辑坐标值转换成设备坐标值的方式,
即是由用户决定一个逻辑单位等于多少个设备单位(cm,mm,m等),而不是由Windows决定。
所以被称之为可编程映射模式;
MM_ISOTROPIC和MM_ANISOTROPIC映射模式最常用于根据窗口尺寸按比例自动调节画图的输出大小的场合。
MM_ISOTROPIC和MM_ANISOTROPIC映射模式的区别
前者中X方向和Y方向具有同一个缩放比例因子,而后者两个方向可以单独缩放;
例子:
CRect rect;
GetClientRect(&rect);
dc.SetMapMode(MM_ISOTROPIC);
dc.SetWindowExt(500,500);//设置窗口范围,将窗口的逻辑尺寸高为500单位×500单位
dc.SetViewportExt(rect.Width(),rect.Height());//设置视口范围
dc.Ellipse(0,0,500,500);
注:窗口的尺寸以逻辑单位计算,视口的尺寸以设备单位或像素计算。
特别说明:
MM_TEXT为默认映射模式,其原点在窗口的左上角,X轴的正向向右,Y轴的正向向下,
并且一个逻辑单位对应于设备坐标下的一个象素
其它映射模式则原点不变,只是Y轴会翻转使正向朝上,并且逻辑单位被按比例转换为实际距离大小,而不是像素数。
需要注意的是,使用公制映射模式(非默认映射模式)时,为使输出可见,Y坐标必须为负值。
例如:
dc.Rectangle(0,0,200,100);//默认模式下画图
dc.SetMapMode(MM_LOENGLISH);//改变映射模式
dc.Rectangle(0,0,200,-100);//画图
映射方法(Mapping Mode) |
逻辑单位 |
坐标轴方向 |
MM_TEXT(默认方式) |
1 pixel |
X轴正方向朝右,Y轴正方向朝下 |
MM_LOMETRIC |
0.1 mm |
X轴正方向朝右,Y轴正方向朝上 |
MM_HIMETRIC |
0.01 mm |
X轴正方向朝右,Y轴正方向朝上 |
MM_LOENGLISH |
0.01 inch |
X轴正方向朝右,Y轴正方向朝上 |
MM_HIENGLISH |
0.001 inch |
X轴正方向朝右,Y轴正方向朝上 |
MM_TWIPS |
1/1440 inch |
X轴正方向朝右,Y轴正方向朝上 |
MM_ISOTROPIC |
自定义(X=Y) |
自定义 |
MM_ANISOTROPIC |
自定义(X!=Y) |
自定义 |
//定义坐标映射方式
WINGDIAPI int WINAPI SetMapMode(HDC, int);
此API函数在MFC中封装为CDC::virtual int SetMapMode(int nMapMode);
//定义逻辑窗口区域,单位为逻辑单位(Logical)
WINGDIAPI BOOL WINAPI SetWindowExtEx (HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetWindowExt(int cx, int cy);
//设置逻辑窗口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL WINAPI SetWindowOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC::CPoint SetWindowOrg(int x, int y);
注意:SetWindowOrg(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。
//定义视口的坐标轴方向及区域、定义域和值域,单位为像素(Pixel)
WINGDIAPI BOOL WINAPI SetViewportExtEx(HDC, int, int, LPSIZE);
此API函数在MFC中封装为CDC::virtual CSize SetViewportExt(int cx, int cy);
注意:SetViewportExt(Ex) 只有在映射模式为MM_ANISOTROPIC或MM_ISOTROPIC时才有意义。
//设置视口的原点坐标,缺省原点为(0,0)。
WINGDIAPI BOOL WINAPI SetViewportOrgEx(HDC, int, int, LPPOINT);
此API函数在MFC中封装为CDC:: virtual CPoint SetViewportOrg(int x, int y);