Windows程序中坐标分为设备坐标和逻辑坐标
绘图时,写代码使用的是逻辑坐标,显示到屏幕上后,要把逻辑坐标转换成设备坐标
默认采用的映射模式是MM_TEXT模式
在写代码时,就像在一张大大的纸上画图,可以有多种模式选择,这张纸叫作窗口,使用逻辑坐标
之后把纸显示到屏幕上,此时要把逻辑坐标转换成设备坐标
设备坐标系统:
如图所示
水平方向:X值从左向右增加
Y值从上向下增加
所有的设备坐标使用的是像素
逻辑坐标和设备坐标的转换公式如下
具体例子:
比如我要在原点0,0处输出文字:
TextOut(hdc, 0, 0, TEXT("HELLO"),5);
效果如下:
此时我更改设备坐标的原点:
SetViewportOrgEx(hdc, 100, 200,NULL);
TextOut(hdc, 0, 0, TEXT("HELLO"),5);
这时根据公式换算,文字输出位置位于100,200
通过改变窗口坐标原点,输出N行文字:
for (int i = 0; i < 5; ++i) {
SetWindowOrgEx(hdc, 0, -16 * i, NULL);
TextOut(hdc, 0, 0, TEXT("HELLO"),5);
}
输出样式:
设备坐标与逻辑坐标转换函数:
窗口使用逻辑坐标,视口使用逻辑坐标,我们有时要对坐标进行转化
POINT apt;
apt.x = cxClient; //视口使用设备坐标
apt.y = cyClient;
DPtoLP(hdc, &apt, 1); //设备坐标转为逻辑坐标
SetWindowOrgEx(hdc, -apt.x / 2, -apt.y / 2, NULL); //窗口使用的是逻辑坐标
TextOut(hdc, 0, 0, TEXT("HELLO"), 5);