ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 1、坐标转换相关api | API函数 | 说明 | | --- | --- | | int GetMapMode(hdc); | GetMapMode获取当前的映射模式 | | int SetMapMode(hdc,fnMapMode); | SetMapMode函数用于设置指定设备环境的映射模式。定义了页面空间单位到设备空间单位的转换,还定义了 x 轴和 y 轴的方向 | | BOOL SetViewportOrgEx(hdc,X,Y,lpPoint); | SetViewportOrgEx 函数指定映射到窗口原点 (0, 0) 的设备原点的坐标。(一般用这个) | |BOOL SetWindowOrgEx(hdc,X,Y,lpPoint); | SetWindowOrgEx 函数指定映射到设备原点 (0, 0) 的窗口原点的坐标。 | | BOOL SetWindowExtEx(hdc,x,y,lpsz); | SetWindowExtEx功能通过使用指定的值设置窗口设备上下文的水平和垂直范围。 **xy看成是宽度与高度,先设SetWindowExtEx,后设SetViewportExtEx** | | BOOL SetViewportExtEx(hdc,x,y,lpsz); | SetViewportExtEx功能通过使用指定的值设置为视口设备上下文的水平和垂直范围 。 **xy看成是宽度与高度**| | BOOL DPtoLP(hdc,lpPoints,nCount); | DPtoLP 将设备坐标转换为逻辑坐标。 | |BOOL LPtoDP(hdc,lpPoints,nCount); | LPtoDP 将逻辑坐标转换为设备坐标。**LPtoDP 函数多次调用会失真,少用** | | int GetMapMode(hdc); | GetMapMode获取当前的映射模式 | ## 2、一些词 ``` 逻辑单位(logical unit) 单位可以是mm、inch、像素px 设备单位(device unit) 如显示器,单位px 窗口:理解成虚拟的平面的直角坐标系,映射就是直角坐标系的某个矩形范围的图形映射到视口(也是一个矩形) 视口:理解成显示器上显示的某个程序的客户区 映射:就是窗口(直角坐标系)某个矩形通过缩放放到视口(也是一个矩形)中。 ``` ![](https://img.kancloud.cn/b1/ae/b1aedc89a4529a3a86b7eb68992a457b_423x310.png) ## 3、映射模式fnMapMode 用的多的就是:MM_LOMETRIC、MM_HIMETRIC、MM\_ISOTROPIC和MM\_ANISOTROPIC | 映射模式 | 说明 | | --- | --- | | MM\_TEXT(默认) | 每个逻辑单位映射为 1 像素,x 轴向右,y 轴向下 | | MM\_LOMETRIC | 每个逻辑单位映射为 0.1 毫米,x 轴向右,y 轴向上 | | MM\_HIMETRIC | 每个逻辑单位映射为 0.01 毫米,x 轴向右,y 轴向上 | | MM\_LOENGLISH | 每个逻辑单位映射为 0.01 英寸,x 轴向右,y 轴向上 | | MM\_HIENGLISH | 每个逻辑单位映射为 0.001 英寸,x 轴向右,y 轴向上 | | MM\_TWIPS | 每个逻辑单位映射为 1/20 点(1/1440 英寸),x 轴向右,y 轴向上 | | MM\_ISOTROPIC | 1\. 逻辑单位被映射为任意缩放刻度 2\. 每个 x 轴的逻辑单位与 y 轴相等 3\. 使用SetWindowExtEx和SetViewportExtEx函数指定相应的单位和方向 4\. 图形设备接口(GDI)将做出必要的调整以确保 x 轴和 y 轴的逻辑单位保持相同尺寸(当窗口被设置时,视口将调整保持“各向同性”) | | MM\_ANISOTROPIC | 1\. 逻辑单位被映射为任意缩放刻度 2\. 使用SetWindowExtEx和SetViewportExtEx函数指定相应的单位,方向和缩放比例 |