int SetMapMode(
HDChdc, // handle to device context
intfnMapMode // new mapping mode
);
该函数设置指定DC的映射模式,映射模式是指页空间到设备控件的单位转换以及设备空间的坐标原点。
映射模式 |
含义 |
MM_ANISOTROPIC |
使用任意轴缩放率的任意单位映射逻辑单位。 使用SetWindowExtEx和SetViewportExtEx指定单位、原点和缩放率 |
MM_HIENGLISH |
每个逻辑单位映射为0.001英寸,X轴向右Y轴向上 |
MM_HIMETRIC |
每个逻辑单位映射为0.01毫米,X轴向右Y轴向上 |
MM_ISOTROPIC |
使用等轴缩放率的任意单位映射逻辑单位;即X轴上的一个单位等于Y轴上的一个单位。 使用SetWindowExtEx和SetViewportExtEx指定单位和坐标原点,GDI根据需要调整使X和Y轴的单位一样。 |
MM_LOENGLISH |
每个逻辑单位映射为0.01英寸,X轴向右Y轴向上 |
MM_LOMETRIC |
每个逻辑单位映射为0.1毫米,X轴向右Y轴向上 |
MM_TEXT |
每个逻辑单位映射为一个设备像素毫米,X轴向右Y轴向下 |
MM_TWIPS |
每个逻辑单位映射为一个打印点的二十分之一(1/1440英寸),X轴向右Y轴向上 |
BOOL SetWindowOrgEx(
HDChdc, // handle to device context
intX, // new x-coordinate of windoworigin
intY, // new y-coordinate of window origin
LPPOINT lpPoint // original window origin
);
该函数用于指定哪个窗口坐标(逻辑坐标系)为视口原点(设备坐标系)。默认视口原点为窗口左上角。
该函数与SetViewportOrgEx功能相似,二者不需同时使用。
BOOL SetViewportOrgEx(
HDChdc, // handle to device context
intX, // new x-coordinate ofviewport origin
intY, // new y-coordinate ofviewport origin
LPPOINT lpPoint // original viewport origin
);
该函数用于指定哪个设备坐标映射(设备坐标系)为窗口原点(逻辑坐标系)。默认视口原点为窗口左上角。
该函数与SetWindowOrgEx功能相似,二者不需同时使用。
BOOL SetWindowExtEx(
HDChdc, // handle to device context
intnXExtent, // new horizontal windowextent
intnYExtent, // new vertical window extent
LPSIZE lpSize // original windowextent
);
该函数用于设置窗口(逻辑坐标系)的水平和垂直最大范围。
BOOL SetViewportExtEx(
HDChdc, // handle to device context
intnXExtent, // new horizontal viewportextent
intnYExtent, // new vertical viewportextent
LPSIZE lpSize // originalviewport extent
);
该函数用于设置视口(设备坐标系的)水平和垂直最大范围。
int SetGraphicsMode(
HDChdc,
intiMode
);
默认iMode为GM_COMPATIBLE,表示兼容16bit操作系统,此时调用SetWorldTransform和ModifyWorldTransform将失败,如果要使用这两个API,需要设置iMode为GM_ADVANCED。
1)文字输出:在GM_COMPATIBLE模式下,TrueType(矢量字体)文字与光栅字体具有相同的行为。TrueType文字总是从左向右写且右侧为上,只有TrueType的高度会被缩放,唯一的非水平输出文字的方法是为DC设定的逻辑字体设置非零的escapement和orientation字段(文字输出方向);
在GM_ADVANCED模式下,TrueType(矢量字体)输出将完全通过世界-设备坐标系变换矩阵,光栅字体只有非常有限的转换能力(整数倍拉伸)。GDI会尝试为光栅字体产生最佳输出。
2)矩形排除:在默认的GM_COMPATIBLE模式下,在绘制矩形时系统会排除指定矩形的底边和最右边。在GM_ADVANCED模式下,底边和最右边是不会被排除的。
3)弧的绘制:在默认的GM_COMPATIBLE模式下,GDI使用设备空间当前的弧方向绘制弧,根据这一规则,弧不关系逻辑到设备的转换。在GM_ADVANCED模式下,GDI总是使用逻辑空间的逆时针方向绘制弧,也就是说弧控制点和弧自身都与世界-设备坐标转换有关。
BOOL SetWorldTransform(
HDChdc,
const XFORM *lpXform
);
BOOL ModifyWorldTransform(
HDChdc,
const XFORM *lpXform,
DWORD iMode
);
SetWorldTransform函数为指定的DC设置世界空间到页面空间的二维线型变换矩阵,该矩阵可用来缩放、旋转、错切、平移输出图形。
矩阵形式:
| eM11 eM12 0 |
| eM21 eM22 0 |
| eDx eDy 1 |
ModifyWorldTransform函数修改指定DC的变换矩阵,iMode指示是重设为单位矩阵(MWT_IDENTITY)、lpXform左乘当前矩阵(MWT_LEFTMULTIPLY)或者右乘当前矩阵(MWT_RIGHTMULTIPLY)。
这两个函数的参数使用的是逻辑单位。
BOOL DPtoLP(
__in HDC hdc,
__inout LPPOINT lpPoints,
__in int nCount
);
BOOL LPtoDP(
__in HDC hdc,
__inout LPPOINT lpPoints,
__in int nCount
);
这两个函数用于设备坐标转换为逻辑坐标(DPtoLP),以及逻辑坐标转换为设备坐标(LPtoDP),这些转换依赖于DC的映射模式、窗口和视口原点和范围以及变换矩阵。
当逻辑坐标操作32位或设备坐标超过27位,该函数将执行失败。
ClientToScreen 用于将窗口客户区坐标转换为屏幕坐标系坐标;
ScreenToClient用于将屏幕坐标系坐标转换为指定窗口的客户区坐标。
默认屏幕坐标是指相对于屏幕左上角的坐标,窗口客户区坐标是指相对于窗口客户区左上角的坐标。
将一个窗口上的客户区坐标映射到另一个窗口的客户区上。