前面以来,写程序,坐标都是相对于用户区域的用像素表示。其实,也可以由其他表示方式,不过由于现在的显示器大小各异,这种相对于真实设备的表示方式也不那么“真实”了。
设定不同的映像方式可以使用:
int
SetMapMode(
HDC hdc, // handle to device context
int fnMapMode // new mapping mode
);
HDC hdc, // handle to device context
int fnMapMode // new mapping mode
);
其中fnMapMode 可以为:
映像方式 | 逻辑单位 | 增加值 | |
x值 | y值 | ||
MM_TEXT | 图素 | 右 | 下 |
MM_LOMETRIC | 0.1 mm | 右 | 上 |
MM_HIMETRIC | 0.01 mm | 右 | 上 |
MM_LOENGLISH | 0.01 in. | 右 | 上 |
MM_HIENGLISH | 0.001 in. | 右 | 上 |
MM_TWIPS | 1/1440 in. | 右 | 上 |
MM_ISOTROPIC | 任意(x = y) | 可选 | 可选 |
MM_ANISOTROPIC | 任意(x != y) | 可选 | 可选 |
当然也可以使用GetMapMode这个函数来取得映像方式。
int
GetMapMode(
HDC hdc // handle to device context
);
HDC hdc // handle to device context
);
由上面可以知道,原点是可以自己设定的。通过下面这个函数你可以设定这个东东:
BOOL SetViewportOrgEx(
HDC hdc, // 设备内容句柄
int X, // 新的原点x坐标(设备单位)
int Y, // 新的原点y坐标(设备单位)
LPPOINT lpPoint // 原来原点坐标(不保存可以设定为NULL)
);
HDC hdc, // 设备内容句柄
int X, // 新的原点x坐标(设备单位)
int Y, // 新的原点y坐标(设备单位)
LPPOINT lpPoint // 原来原点坐标(不保存可以设定为NULL)
);
BOOL SetWindowOrgEx (
HDC hdc, // 设备内容句柄
int X, // 新的原点x坐标(逻辑单位)
int Y, // 新的原点y坐标(逻辑单位)
LPPOINT lpPoint // 原来原点坐标(不保存可以设定为NULL)
);
HDC hdc, // 设备内容句柄
int X, // 新的原点x坐标(逻辑单位)
int Y, // 新的原点y坐标(逻辑单位)
LPPOINT lpPoint // 原来原点坐标(不保存可以设定为NULL)
);
坐标转化:
DPtoLP函数用于将设备坐标转化为逻辑坐标。这个转化取决于映像方式原点位置等。
BOOL DPtoLP(
HDC hdc, // 设备内容句柄
LPPOINT lpPoints, // 点的数组
int nCount // 点的个数
);
HDC hdc, // 设备内容句柄
LPPOINT lpPoints, // 点的数组
int nCount // 点的个数
);
LPtoDP函数用于将逻辑坐标转化为设备坐标。这个转化取决于映像方式原点位置等。
BOOL LPtoDP(
HDC hdc, // 设备内容句柄
LPPOINT lpPoints, // 点的数组
int nCount // 点的个数
);
HDC hdc, // 设备内容句柄
LPPOINT lpPoints, // 点的数组
int nCount // 点的个数
);
好了,其他的就是每种映像方式的具体应用了,多看书就好了。